Run ’download_data.Rmd` First!

options(na.action = "na.fail") 

library(tidyverse)
library(dplyr)

source("./helper__dredge_functions.R")
model_average_richness <- function(data) {
  model_average(percentage_of_regional_pool_present ~ mean_elevation_scaled + elevation_delta_scaled + closed_forest + cultivated + herbaceous_vegetation + herbaceous_wetland + open_forest + permanent_water + shrubs + urban + realm + number_of_checklists_scaled + (1|city_name), data, 4)
}
Find city predictors
create_city_dataset <- function(mixed_model) {
  city_coeefs <- ranef(mixed_model)$city_name
  city_coeefs <- cbind(city_name = rownames(city_coeefs), city_coeefs)
  rownames(city_coeefs) <- NULL
  names(city_coeefs) <- c('name', 'response')
  
  left_join(city_coeefs, city_data)
}
Merlin: Difference in richness
merlin_richness_result <- model_average_richness(merlin)
Warning: comparing models fitted by REMLFixed term is "(Intercept)"
merlin_richness_result

Call:
model.avg(object = dredge_result, subset = delta < aic_delta)

Component model call: 
lmer(formula = percentage_of_regional_pool_present ~ <8 unique rhs>, data = data)

Component models: 
                           df    logLik     AICc delta weight
1/2/3/4/5/6/7/8/9/10/11    18 -24617.98 49272.05  0.00   0.24
1/2/3/4/5/6/7/8/10/11      17 -24619.11 49272.29  0.24   0.21
1/2/4/5/6/7/8/9/10/11      17 -24619.43 49272.93  0.89   0.15
1/2/4/5/6/7/8/10/11        16 -24620.49 49273.04  0.99   0.14
1/2/3/4/5/6/7/8/9/10/11/12 19 -24618.08 49274.25  2.20   0.08
1/2/3/4/5/6/7/8/10/11/12   18 -24619.09 49274.26  2.22   0.08
1/2/4/5/6/7/8/10/11/12     17 -24620.47 49275.02  2.97   0.05
1/2/4/5/6/7/8/9/10/11/12   18 -24619.52 49275.12  3.07   0.05

Term codes: 
              closed_forest                  cultivated      elevation_delta_scaled       herbaceous_vegetation          herbaceous_wetland       mean_elevation_scaled 
                          1                           2                           3                           4                           5                           6 
number_of_checklists_scaled                 open_forest             permanent_water                       realm                      shrubs                       urban 
                          7                           8                           9                          10                          11                          12 

Model-averaged coefficients:  
(full average) 
                            Estimate Std. Error Adjusted SE z value Pr(>|z|)    
(Intercept)                 14.09316    0.88391     0.88404  15.942  < 2e-16 ***
closed_forest                3.89893    0.70680     0.70690   5.516  < 2e-16 ***
cultivated                  11.37400    0.98130     0.98144  11.589  < 2e-16 ***
elevation_delta_scaled       0.58915    0.82679     0.82687   0.713   0.4761    
herbaceous_vegetation        9.88097    1.08890     1.08906   9.073  < 2e-16 ***
herbaceous_wetland          12.35171    3.13811     3.13856   3.935 8.30e-05 ***
mean_elevation_scaled       -4.60340    1.81547     1.81571   2.535   0.0112 *  
number_of_checklists_scaled 20.82193    0.64287     0.64296  32.384  < 2e-16 ***
open_forest                 12.96359    0.98655     0.98669  13.138  < 2e-16 ***
permanent_water             -0.36087    0.59918     0.59923   0.602   0.5470    
realmAfrotropic              3.42908    1.91360     1.91387   1.792   0.0732 .  
realmAustralasia            -3.14597    3.13851     3.13896   1.002   0.3162    
realmIndomalayan            -1.55901    1.21340     1.21357   1.285   0.1989    
realmNearctic               -5.99756    1.41243     1.41263   4.246 2.18e-05 ***
realmNeotropic              -2.12324    1.42796     1.42817   1.487   0.1371    
shrubs                       6.29980    1.45822     1.45842   4.320 1.56e-05 ***
urban                        0.04047    0.18754     0.18756   0.216   0.8292    
 
(conditional average) 
                            Estimate Std. Error Adjusted SE z value Pr(>|z|)    
(Intercept)                  14.0932     0.8839      0.8840  15.942  < 2e-16 ***
closed_forest                 3.8989     0.7068      0.7069   5.516  < 2e-16 ***
cultivated                   11.3740     0.9813      0.9814  11.589  < 2e-16 ***
elevation_delta_scaled        0.9802     0.8683      0.8685   1.129   0.2591    
herbaceous_vegetation         9.8810     1.0889      1.0891   9.073  < 2e-16 ***
herbaceous_wetland           12.3517     3.1381      3.1386   3.935 8.30e-05 ***
mean_elevation_scaled        -4.6034     1.8155      1.8157   2.535   0.0112 *  
number_of_checklists_scaled  20.8219     0.6429      0.6430  32.384  < 2e-16 ***
open_forest                  12.9636     0.9866      0.9867  13.138  < 2e-16 ***
permanent_water              -0.6993     0.6775      0.6776   1.032   0.3021    
realmAfrotropic               3.4291     1.9136      1.9139   1.792   0.0732 .  
realmAustralasia             -3.1460     3.1385      3.1390   1.002   0.3162    
realmIndomalayan             -1.5590     1.2134      1.2136   1.285   0.1989    
realmNearctic                -5.9976     1.4124      1.4126   4.246 2.18e-05 ***
realmNeotropic               -2.1232     1.4280      1.4282   1.487   0.1371    
shrubs                        6.2998     1.4582      1.4584   4.320 1.56e-05 ***
urban                         0.1554     0.3423      0.3424   0.454   0.6499    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
merlin_mixed_model <- lmer(percentage_of_regional_pool_present ~ mean_elevation_scaled + elevation_delta_scaled + closed_forest + cultivated + herbaceous_vegetation + herbaceous_wetland + open_forest + permanent_water + shrubs + realm + number_of_checklists_scaled + (1|city_name), merlin)
r.squaredGLMM(merlin_mixed_model)
           R2m       R2c
[1,] 0.1614687 0.6330958
merlin_fixed_model <- lm(percentage_of_regional_pool_present ~ mean_elevation_scaled + elevation_delta_scaled + closed_forest + cultivated + herbaceous_vegetation + herbaceous_wetland + open_forest + permanent_water + shrubs + realm + number_of_checklists_scaled, merlin)
anova(merlin_mixed_model, merlin_fixed_model)
refitting model(s) with ML (instead of REML)
Data: merlin
Models:
merlin_fixed_model: percentage_of_regional_pool_present ~ mean_elevation_scaled + elevation_delta_scaled + closed_forest + cultivated + herbaceous_vegetation + herbaceous_wetland + open_forest + permanent_water + shrubs + realm + number_of_checklists_scaled
merlin_mixed_model: percentage_of_regional_pool_present ~ mean_elevation_scaled + elevation_delta_scaled + closed_forest + cultivated + herbaceous_vegetation + herbaceous_wetland + open_forest + permanent_water + shrubs + realm + number_of_checklists_scaled + (1 | city_name)
                   npar   AIC   BIC logLik deviance  Chisq Df Pr(>Chisq)    
merlin_fixed_model   17 50580 50700 -25273    50546                         
merlin_mixed_model   18 49305 49432 -24634    49269 1277.7  1  < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
anova(merlin_mixed_model, lm(percentage_of_regional_pool_present ~ city_name, merlin))
refitting model(s) with ML (instead of REML)
Data: merlin
Models:
merlin_mixed_model: percentage_of_regional_pool_present ~ mean_elevation_scaled + elevation_delta_scaled + closed_forest + cultivated + herbaceous_vegetation + herbaceous_wetland + open_forest + permanent_water + shrubs + realm + number_of_checklists_scaled + (1 | city_name)
lm(percentage_of_regional_pool_present ~ city_name, merlin): percentage_of_regional_pool_present ~ city_name
                                                            npar   AIC   BIC logLik deviance Chisq  Df Pr(>Chisq)
merlin_mixed_model                                            18 49305 49432 -24634    49269                     
lm(percentage_of_regional_pool_present ~ city_name, merlin)  138 50605 51576 -25164    50329     0 120          1
merlin_richness_sum <- model_summary('merlin', 'richness', merlin_richness_result)
merlin_richness_sum
merlin_city_response <- create_city_dataset(merlin_mixed_model)
Joining, by = "name"
merlin_city_response[order(merlin_city_response$response), c('name', 'response')]
write_csv(merlin_city_response[, c('name', 'response')], 'percentage_of_regional_richness__output__merlin_city_richness_intercept.csv')
summary(merlin_mixed_model)
Linear mixed model fit by REML ['lmerMod']
Formula: percentage_of_regional_pool_present ~ mean_elevation_scaled +      elevation_delta_scaled + closed_forest + cultivated + herbaceous_vegetation +  
    herbaceous_wetland + open_forest + permanent_water + shrubs +      realm + number_of_checklists_scaled + (1 | city_name)
   Data: merlin

REML criterion at convergence: 49236

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.0484 -0.6453 -0.0591  0.5795  6.2777 

Random effects:
 Groups    Name        Variance Std.Dev.
 city_name (Intercept) 24.59    4.959   
 Residual              19.13    4.374   
Number of obs: 8443, groups:  city_name, 137

Fixed effects:
                            Estimate Std. Error t value
(Intercept)                  14.1438     0.8719  16.222
mean_elevation_scaled        -5.0263     1.8278  -2.750
elevation_delta_scaled        1.0054     0.8685   1.158
closed_forest                 3.8365     0.6942   5.526
cultivated                   11.3259     0.9672  11.710
herbaceous_vegetation         9.8109     1.0795   9.088
herbaceous_wetland           12.4718     3.1352   3.978
open_forest                  12.8555     0.9867  13.029
permanent_water              -0.7345     0.6589  -1.115
shrubs                        6.2175     1.4540   4.276
realmAfrotropic               3.5255     1.9121   1.844
realmAustralasia             -3.1666     3.1348  -1.010
realmIndomalayan             -1.5482     1.2120  -1.277
realmNearctic                -5.9691     1.4107  -4.231
realmNeotropic               -2.0731     1.4264  -1.453
number_of_checklists_scaled  20.8490     0.6433  32.411

Correlation matrix not shown by default, as p = 16 > 12.
Use print(x, correlation=TRUE)  or
    vcov(x)        if you need it
merlin_richness_plot <- merlin_richness_sum[merlin_richness_sum$model == 'full',]
merlin_richness_plot$explanatory <- factor(merlin_richness_plot$explanatory, levels = c('closed_forest', 'open_forest', 'shrubs', 'herbaceous_vegetation', 'herbaceous_wetland', 'permanent_water', 'cultivated', 'urban', 'mean_elevation_scaled', 'elevation_delta_scaled', 'realmAfrotropic', 'realmAustralasia', 'realmIndomalayan', 'realmNearctic', 'realmNeotropic', 'number_of_checklists_scaled'))
merlin_richness_plot$type <- 'Proportion of landcover\n5 km around site'
merlin_richness_plot$type[merlin_richness_plot$explanatory %in% c('mean_elevation_scaled', 'elevation_delta_scaled')] <- 'Scaled (0-1) average\nelevation 5 km around site'
merlin_richness_plot$type[merlin_richness_plot$explanatory %in% c('realmAfrotropic', 'realmAustralasia', 'realmIndomalayan', 'realmNearctic', 'realmNeotropic')] <- 'Realm'
merlin_richness_plot$type[merlin_richness_plot$explanatory %in% c('number_of_checklists_scaled')] <- 'Scaled (0 - 1) number\nof checklists'

ggplot(merlin_richness_plot, aes(y=explanatory, x=richness_merlin_estimate, colour = type)) + 
  geom_line() +
  geom_point()+
  geom_errorbar(aes(xmin=richness_merlin_estimate-richness_merlin_error, xmax=richness_merlin_estimate+richness_merlin_error), width=.2,
                 position=position_dodge(0.05)) +
  scale_y_discrete(
    limits = rev(levels(merlin_richness_plot$explanatory)), 
    labels = c('closed_forest' = 'Closed forest', 'open_forest' = 'Open forest', 'shrubs' = 'Shrubs', 'herbaceous_vegetation' = 'Herbaceous\nvegetation', 'herbaceous_wetland' = 'Herbaceous\nwetland', 'permanent_water' = 'Permanent\nwater', 'cultivated' = 'Cultivated', 'urban' = 'Urban', 'mean_elevation_scaled' = 'Mean elevation\nscaled', 'elevation_delta_scaled' = 'Elevation delta\nscaled', 'realmAfrotropic' = 'Afrotropical', 'realmAustralasia' = 'Austaliasian', 'realmIndomalayan' = 'Indomalayan', 'realmNearctic' = 'Nearctic', 'realmNeotropic' = 'Neotropical', 'number_of_checklists_scaled' = 'Sqrt number\nof checklists')) +
  theme_bw() +
  geom_vline(xintercept=0, linetype="dotted") +
  guides(colour=guide_legend(title="Predictor type")) + xlab('Increase in proportion of regional richness\n± Standard Error') + ylab('Predictor') +
  theme(legend.justification = "top")

ggsave('percentage_of_regional_pool__output__merlin_richness_result.jpg')
Saving 7.29 x 4.51 in image

Birdlife: Difference in richness
bl_richness_result <- model_average_richness(birdlife)
Warning: comparing models fitted by REMLFixed term is "(Intercept)"
bl_richness_result

Call:
model.avg(object = dredge_result, subset = delta < aic_delta)

Component model call: 
lmer(formula = percentage_of_regional_pool_present ~ <5 unique rhs>, data = data)

Component models: 
                           df    logLik     AICc delta weight
1/2/4/5/6/7/8/9/10/11      17 -25622.28 51278.63  0.00   0.32
1/2/3/4/5/6/7/8/9/10/11    18 -25621.28 51278.64  0.00   0.32
1/2/4/5/6/7/8/9/10/11/12   18 -25621.95 51279.97  1.34   0.16
1/2/3/4/5/6/7/8/9/10/11/12 19 -25620.96 51280.01  1.38   0.16
1/2/4/5/6/7/8/10/11/12     17 -25624.23 51282.53  3.89   0.05

Term codes: 
              closed_forest                  cultivated      elevation_delta_scaled       herbaceous_vegetation          herbaceous_wetland       mean_elevation_scaled 
                          1                           2                           3                           4                           5                           6 
number_of_checklists_scaled                 open_forest             permanent_water                       realm                      shrubs                       urban 
                          7                           8                           9                          10                          11                          12 

Model-averaged coefficients:  
(full average) 
                            Estimate Std. Error Adjusted SE z value Pr(>|z|)    
(Intercept)                  12.3727     0.6656      0.6657  18.586  < 2e-16 ***
closed_forest                 4.6122     0.8136      0.8137   5.668  < 2e-16 ***
cultivated                   11.3601     1.1041      1.1043  10.287  < 2e-16 ***
herbaceous_vegetation        11.6039     1.2364      1.2366   9.384  < 2e-16 ***
herbaceous_wetland           12.0168     3.5407      3.5412   3.393  0.00069 ***
mean_elevation_scaled        -3.7033     1.5005      1.5007   2.468  0.01360 *  
number_of_checklists_scaled  25.0703     0.7297      0.7298  34.353  < 2e-16 ***
open_forest                  16.1070     1.1164      1.1165  14.426  < 2e-16 ***
permanent_water              -1.5753     0.8385      0.8386   1.879  0.06031 .  
realmAfrotropic              -1.4162     1.4153      1.4155   1.000  0.31709    
realmAustralasia             -3.2249     2.1301      2.1304   1.514  0.13009    
realmIndomalayan             -4.3603     0.8615      0.8616   5.061 4.00e-07 ***
realmNearctic                -2.6755     0.9471      0.9473   2.824  0.00474 ** 
realmNeotropic               -4.1732     1.0243      1.0245   4.074 4.63e-05 ***
shrubs                        9.0283     1.6084      1.6086   5.613  < 2e-16 ***
elevation_delta_scaled        0.2427     0.6903      0.6904   0.351  0.72523    
urban                         0.1323     0.3002      0.3002   0.441  0.65943    
 
(conditional average) 
                            Estimate Std. Error Adjusted SE z value Pr(>|z|)    
(Intercept)                  12.3727     0.6656      0.6657  18.586  < 2e-16 ***
closed_forest                 4.6122     0.8136      0.8137   5.668  < 2e-16 ***
cultivated                   11.3601     1.1041      1.1043  10.287  < 2e-16 ***
herbaceous_vegetation        11.6039     1.2364      1.2366   9.384  < 2e-16 ***
herbaceous_wetland           12.0168     3.5407      3.5412   3.393  0.00069 ***
mean_elevation_scaled        -3.7033     1.5005      1.5007   2.468  0.01360 *  
number_of_checklists_scaled  25.0703     0.7297      0.7298  34.353  < 2e-16 ***
open_forest                  16.1070     1.1164      1.1165  14.426  < 2e-16 ***
permanent_water              -1.6499     0.7830      0.7832   2.107  0.03514 *  
realmAfrotropic              -1.4162     1.4153      1.4155   1.000  0.31709    
realmAustralasia             -3.2249     2.1301      2.1304   1.514  0.13009    
realmIndomalayan             -4.3603     0.8615      0.8616   5.061 4.00e-07 ***
realmNearctic                -2.6755     0.9471      0.9473   2.824  0.00474 ** 
realmNeotropic               -4.1732     1.0243      1.0245   4.074 4.63e-05 ***
shrubs                        9.0283     1.6084      1.6086   5.613  < 2e-16 ***
elevation_delta_scaled        0.5102     0.9303      0.9304   0.548  0.58343    
urban                         0.3606     0.4040      0.4041   0.892  0.37217    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
birdlife_mixed_model <- lmer(percentage_of_regional_pool_present ~ mean_elevation_scaled + closed_forest + cultivated + herbaceous_vegetation + herbaceous_wetland + open_forest + shrubs + realm + (1|city_name), birdlife)
r.squaredGLMM(birdlife_mixed_model)
           R2m       R2c
[1,] 0.1072897 0.3305271
summary(birdlife_mixed_model)
Linear mixed model fit by REML ['lmerMod']
Formula: percentage_of_regional_pool_present ~ mean_elevation_scaled +      closed_forest + cultivated + herbaceous_vegetation + herbaceous_wetland +  
    open_forest + shrubs + realm + (1 | city_name)
   Data: birdlife

REML criterion at convergence: 52351.5

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.2243 -0.6782 -0.0908  0.6152  4.9342 

Random effects:
 Groups    Name        Variance Std.Dev.
 city_name (Intercept)  9.381   3.063   
 Residual              28.132   5.304   
Number of obs: 8443, groups:  city_name, 137

Fixed effects:
                      Estimate Std. Error t value
(Intercept)            13.2793     0.6152  21.584
mean_elevation_scaled  -3.5910     1.4355  -2.502
closed_forest           3.6458     0.8310   4.387
cultivated             11.7687     1.1288  10.426
herbaceous_vegetation  10.1846     1.2886   7.904
herbaceous_wetland      9.8345     3.7552   2.619
open_forest            15.7218     1.1651  13.495
shrubs                  9.3424     1.6824   5.553
realmAfrotropic        -1.5413     1.4110  -1.092
realmAustralasia       -3.0458     2.0803  -1.464
realmIndomalayan       -4.2258     0.8522  -4.958
realmNearctic          -1.7182     0.9236  -1.860
realmNeotropic         -4.0139     1.0135  -3.960

Correlation matrix not shown by default, as p = 13 > 12.
Use print(x, correlation=TRUE)  or
    vcov(x)        if you need it
birdlife_fixed_model <- lm(percentage_of_regional_pool_present ~ mean_elevation_scaled + closed_forest + cultivated + herbaceous_vegetation + herbaceous_wetland + open_forest + shrubs + realm, birdlife)
anova(birdlife_mixed_model, birdlife_fixed_model)
refitting model(s) with ML (instead of REML)
Data: birdlife
Models:
birdlife_fixed_model: percentage_of_regional_pool_present ~ mean_elevation_scaled + closed_forest + cultivated + herbaceous_vegetation + herbaceous_wetland + open_forest + shrubs + realm
birdlife_mixed_model: percentage_of_regional_pool_present ~ mean_elevation_scaled + closed_forest + cultivated + herbaceous_vegetation + herbaceous_wetland + open_forest + shrubs + realm + (1 | city_name)
                     npar   AIC   BIC logLik deviance  Chisq Df Pr(>Chisq)    
birdlife_fixed_model   14 53110 53208 -26541    53082                         
birdlife_mixed_model   15 52408 52514 -26189    52378 703.39  1  < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
summary(birdlife_fixed_model)

Call:
lm(formula = percentage_of_regional_pool_present ~ mean_elevation_scaled + 
    closed_forest + cultivated + herbaceous_vegetation + herbaceous_wetland + 
    open_forest + shrubs + realm, data = birdlife)

Residuals:
     Min       1Q   Median       3Q      Max 
-16.7661  -4.0084  -0.5982   3.3769  27.5192 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)    
(Intercept)            14.5614     0.2319  62.795  < 2e-16 ***
mean_elevation_scaled  -3.7600     0.5323  -7.064 1.75e-12 ***
closed_forest           2.0352     0.7227   2.816  0.00487 ** 
cultivated             16.0866     0.9808  16.401  < 2e-16 ***
herbaceous_vegetation   9.2569     1.0864   8.521  < 2e-16 ***
herbaceous_wetland      0.2377     3.5321   0.067  0.94636    
open_forest            14.3239     1.0159  14.100  < 2e-16 ***
shrubs                  6.7982     1.1102   6.124 9.56e-10 ***
realmAfrotropic        -2.1892     0.7785  -2.812  0.00493 ** 
realmAustralasia       -4.3652     0.3482 -12.537  < 2e-16 ***
realmIndomalayan       -5.7999     0.3142 -18.460  < 2e-16 ***
realmNearctic          -2.5121     0.2285 -10.995  < 2e-16 ***
realmNeotropic         -5.2385     0.3279 -15.978  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 5.615 on 8430 degrees of freedom
Multiple R-squared:  0.1424,    Adjusted R-squared:  0.1411 
F-statistic: 116.6 on 12 and 8430 DF,  p-value: < 2.2e-16
birdlife_city_response <- create_city_dataset(birdlife_mixed_model)
Joining, by = "name"
birdlife_city_response[order(birdlife_city_response$response), c('name', 'response')]
write_csv(birdlife_city_response[, c('name', 'response')], 'percentage_of_regional_richness__output__birdlife_city_richness_intercept.csv')
bl_richness_sum <- model_summary('birdlife', 'richness', bl_richness_result)
bl_richness_sum
summary(birdlife_mixed_model)
Linear mixed model fit by REML ['lmerMod']
Formula: percentage_of_regional_pool_present ~ mean_elevation_scaled +      closed_forest + cultivated + herbaceous_vegetation + herbaceous_wetland +  
    open_forest + shrubs + realm + (1 | city_name)
   Data: birdlife

REML criterion at convergence: 52351.5

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.2243 -0.6782 -0.0908  0.6152  4.9342 

Random effects:
 Groups    Name        Variance Std.Dev.
 city_name (Intercept)  9.381   3.063   
 Residual              28.132   5.304   
Number of obs: 8443, groups:  city_name, 137

Fixed effects:
                      Estimate Std. Error t value
(Intercept)            13.2793     0.6152  21.584
mean_elevation_scaled  -3.5910     1.4355  -2.502
closed_forest           3.6458     0.8310   4.387
cultivated             11.7687     1.1288  10.426
herbaceous_vegetation  10.1846     1.2886   7.904
herbaceous_wetland      9.8345     3.7552   2.619
open_forest            15.7218     1.1651  13.495
shrubs                  9.3424     1.6824   5.553
realmAfrotropic        -1.5413     1.4110  -1.092
realmAustralasia       -3.0458     2.0803  -1.464
realmIndomalayan       -4.2258     0.8522  -4.958
realmNearctic          -1.7182     0.9236  -1.860
realmNeotropic         -4.0139     1.0135  -3.960

Correlation matrix not shown by default, as p = 13 > 12.
Use print(x, correlation=TRUE)  or
    vcov(x)        if you need it
birdlife_richness_plot <- bl_richness_sum[bl_richness_sum$model == 'full',]
birdlife_richness_plot$explanatory <- factor(birdlife_richness_plot$explanatory, levels = c('closed_forest', 'open_forest', 'shrubs', 'herbaceous_vegetation', 'herbaceous_wetland', 'permanent_water', 'cultivated', 'urban', 'mean_elevation_scaled', 'elevation_delta_scaled', 'realmAfrotropic', 'realmAustralasia', 'realmIndomalayan', 'realmNearctic', 'realmNeotropic', 'number_of_checklists_scaled'))
birdlife_richness_plot$type <- 'Proportion of landcover\n5 km around site'
birdlife_richness_plot$type[birdlife_richness_plot$explanatory %in% c('mean_elevation_scaled', 'elevation_delta_scaled')] <- 'Scaled (0-1) average\nelevation 5 km around site'
birdlife_richness_plot$type[birdlife_richness_plot$explanatory %in% c('realmAfrotropic', 'realmAustralasia', 'realmIndomalayan', 'realmNearctic', 'realmNeotropic')] <- 'Realm'
birdlife_richness_plot$type[birdlife_richness_plot$explanatory %in% c('number_of_checklists_scaled')] <- 'Scaled (0 - 1) number\nof checklists'

birdlife_plot = ggplot(birdlife_richness_plot, aes(y=explanatory, x=richness_birdlife_estimate, colour = type)) + 
  geom_line() +
  geom_point()+
  geom_errorbar(aes(xmin=richness_birdlife_estimate-richness_birdlife_error, xmax=richness_birdlife_estimate+richness_birdlife_error), width=.2,
                 position=position_dodge(0.05)) +
  scale_y_discrete(
    limits = rev(levels(birdlife_richness_plot$explanatory)), 
    labels = c('closed_forest' = 'Closed forest', 'open_forest' = 'Open forest', 'shrubs' = 'Shrubs', 'herbaceous_vegetation' = 'Herbaceous\nvegetation', 'herbaceous_wetland' = 'Herbaceous\nwetland', 'permanent_water' = 'Permanent\nwater', 'cultivated' = 'Cultivated', 'urban' = 'Urban', 'mean_elevation_scaled' = 'Mean elevation\nscaled', 'elevation_delta_scaled' = 'Elevation delta\nscaled', 'realmAfrotropic' = 'Afrotropical', 'realmAustralasia' = 'Austaliasian', 'realmIndomalayan' = 'Indomalayan', 'realmNearctic' = 'Nearctic', 'realmNeotropic' = 'Neotropical', 'number_of_checklists_scaled' = 'Sqrt number\nof checklists')) +
  theme_bw() +
  geom_vline(xintercept=0, linetype="dotted") +
  guides(colour=guide_legend(title="Predictor type")) + xlab('Increase in proportion of regional pool richness\n± Standard Error') + ylab('Predictor') +
  theme(legend.justification = "top")
birdlife_plot
ggsave('percentage_of_regional_pool__output__birdlife_richness_result.jpg')
Saving 7.29 x 4.51 in image

Both: Difference in richness
both_richness_result <- model_average_richness(both)
Warning: comparing models fitted by REMLFixed term is "(Intercept)"
Warning: Model failed to converge with max|grad| = 0.00314894 (tol = 0.002, component 1)
both_richness_result

Call:
model.avg(object = dredge_result, subset = delta < aic_delta)

Component model call: 
lmer(formula = percentage_of_regional_pool_present ~ <7 unique rhs>, data = data)

Component models: 
                           df    logLik     AICc delta weight
1/2/3/4/5/6/7/8/9/10/11    18 -26535.43 53106.94  0.00   0.35
1/2/4/5/6/7/8/9/10/11      17 -26536.96 53107.99  1.06   0.20
1/2/3/4/5/6/7/8/9/10/11/12 19 -26535.19 53108.46  1.53   0.16
1/2/4/5/6/7/8/9/10/11/12   18 -26536.70 53109.48  2.54   0.10
1/2/3/4/5/6/7/8/10/11      17 -26537.95 53109.98  3.05   0.08
1/2/3/4/5/6/7/8/10/11/12   18 -26537.13 53110.34  3.41   0.06
1/2/4/5/6/7/8/10/11        16 -26539.40 53110.85  3.92   0.05

Term codes: 
              closed_forest                  cultivated      elevation_delta_scaled       herbaceous_vegetation          herbaceous_wetland       mean_elevation_scaled 
                          1                           2                           3                           4                           5                           6 
number_of_checklists_scaled                 open_forest             permanent_water                       realm                      shrubs                       urban 
                          7                           8                           9                          10                          11                          12 

Model-averaged coefficients:  
(full average) 
                            Estimate Std. Error Adjusted SE z value Pr(>|z|)    
(Intercept)                 16.76949    0.93298     0.93311  17.972  < 2e-16 ***
closed_forest                5.23725    0.89790     0.89803   5.832  < 2e-16 ***
cultivated                  13.56656    1.23804     1.23822  10.957  < 2e-16 ***
elevation_delta_scaled       0.70796    1.00687     1.00697   0.703  0.48202    
herbaceous_vegetation       12.60120    1.37494     1.37514   9.164  < 2e-16 ***
herbaceous_wetland          16.36089    3.95058     3.95114   4.141 3.46e-05 ***
mean_elevation_scaled       -5.47279    2.05661     2.05689   2.661  0.00780 ** 
number_of_checklists_scaled 26.72527    0.81075     0.81087  32.959  < 2e-16 ***
open_forest                 17.44821    1.24768     1.24785  13.983  < 2e-16 ***
permanent_water             -1.20865    0.97092     0.97101   1.245  0.21323    
realmAfrotropic              1.82107    2.01065     2.01093   0.906  0.36516    
realmAustralasia            -0.58699    3.20839     3.20885   0.183  0.85485    
realmIndomalayan            -3.30686    1.25716     1.25734   2.630  0.00854 ** 
realmNearctic               -6.40401    1.43543     1.43563   4.461 8.20e-06 ***
realmNeotropic              -4.08496    1.48660     1.48681   2.747  0.00601 ** 
shrubs                       9.75278    1.82036     1.82062   5.357 1.00e-07 ***
urban                        0.09439    0.28888     0.28892   0.327  0.74389    
 
(conditional average) 
                            Estimate Std. Error Adjusted SE z value Pr(>|z|)    
(Intercept)                  16.7695     0.9330      0.9331  17.972  < 2e-16 ***
closed_forest                 5.2372     0.8979      0.8980   5.832  < 2e-16 ***
cultivated                   13.5666     1.2380      1.2382  10.957  < 2e-16 ***
elevation_delta_scaled        1.0912     1.0698      1.0699   1.020  0.30776    
herbaceous_vegetation        12.6012     1.3749      1.3751   9.164  < 2e-16 ***
herbaceous_wetland           16.3609     3.9506      3.9511   4.141 3.46e-05 ***
mean_elevation_scaled        -5.4728     2.0566      2.0569   2.661  0.00780 ** 
number_of_checklists_scaled  26.7253     0.8108      0.8109  32.959  < 2e-16 ***
open_forest                  17.4482     1.2477      1.2479  13.983  < 2e-16 ***
permanent_water              -1.4886     0.8628      0.8629   1.725  0.08451 .  
realmAfrotropic               1.8211     2.0106      2.0109   0.906  0.36516    
realmAustralasia             -0.5870     3.2084      3.2089   0.183  0.85485    
realmIndomalayan             -3.3069     1.2572      1.2573   2.630  0.00854 ** 
realmNearctic                -6.4040     1.4354      1.4356   4.461 8.20e-06 ***
realmNeotropic               -4.0850     1.4866      1.4868   2.747  0.00601 ** 
shrubs                        9.7528     1.8204      1.8206   5.357 1.00e-07 ***
urban                         0.2924     0.4479      0.4480   0.653  0.51389    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
both_mixed_model <- lmer(percentage_of_regional_pool_present ~ mean_elevation_scaled + elevation_delta_scaled + closed_forest + cultivated + herbaceous_vegetation + herbaceous_wetland + open_forest + permanent_water + shrubs + realm + number_of_checklists_scaled + (1|city_name), both)
r.squaredGLMM(both_mixed_model)
           R2m       R2c
[1,] 0.1688506 0.5417001
both_fixed_model <- lm(percentage_of_regional_pool_present ~ mean_elevation_scaled + elevation_delta_scaled + closed_forest + cultivated + herbaceous_vegetation + herbaceous_wetland + open_forest + permanent_water + shrubs + realm + number_of_checklists_scaled, both)
anova(both_mixed_model, both_fixed_model)
refitting model(s) with ML (instead of REML)
Data: both
Models:
both_fixed_model: percentage_of_regional_pool_present ~ mean_elevation_scaled + elevation_delta_scaled + closed_forest + cultivated + herbaceous_vegetation + herbaceous_wetland + open_forest + permanent_water + shrubs + realm + number_of_checklists_scaled
both_mixed_model: percentage_of_regional_pool_present ~ mean_elevation_scaled + elevation_delta_scaled + closed_forest + cultivated + herbaceous_vegetation + herbaceous_wetland + open_forest + permanent_water + shrubs + realm + number_of_checklists_scaled + (1 | city_name)
                 npar   AIC   BIC logLik deviance  Chisq Df Pr(>Chisq)    
both_fixed_model   17 54137 54257 -27052    54103                         
both_mixed_model   18 53144 53271 -26554    53108 994.91  1  < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
both_richness_sum <- model_summary('both', 'richness', both_richness_result)
both_richness_sum
both_city_response <- create_city_dataset(both_mixed_model)
Joining, by = "name"
both_city_response[order(both_city_response$response), c('name', 'response')]
write_csv(both_city_response[, c('name', 'response')], 'percentage_of_regional_richness__output__both_city_richness_intercept.csv')
Either: Difference in richness
either_richness_result <- model_average_richness(either)
Warning: comparing models fitted by REMLFixed term is "(Intercept)"
either_richness_result

Call:
model.avg(object = dredge_result, subset = delta < aic_delta)

Component model call: 
lmer(formula = percentage_of_regional_pool_present ~ <8 unique rhs>, data = data)

Component models: 
                           df    logLik     AICc delta weight
1/2/4/5/6/7/8/9/10/11      17 -23755.12 47544.31  0.00   0.23
1/2/3/4/5/6/7/8/9/10/11    18 -23754.19 47544.46  0.15   0.22
1/2/4/5/6/7/8/10/11        16 -23756.62 47545.30  0.98   0.14
1/2/3/4/5/6/7/8/10/11      17 -23755.74 47545.55  1.24   0.13
1/2/4/5/6/7/8/9/10/11/12   18 -23755.19 47546.46  2.15   0.08
1/2/3/4/5/6/7/8/9/10/11/12 19 -23754.28 47546.64  2.33   0.07
1/2/4/5/6/7/8/10/11/12     17 -23756.30 47546.67  2.35   0.07
1/2/3/4/5/6/7/8/10/11/12   18 -23755.43 47546.95  2.63   0.06

Term codes: 
              closed_forest                  cultivated      elevation_delta_scaled       herbaceous_vegetation          herbaceous_wetland       mean_elevation_scaled 
                          1                           2                           3                           4                           5                           6 
number_of_checklists_scaled                 open_forest             permanent_water                       realm                      shrubs                       urban 
                          7                           8                           9                          10                          11                          12 

Model-averaged coefficients:  
(full average) 
                            Estimate Std. Error Adjusted SE z value Pr(>|z|)    
(Intercept)                 10.79309    0.56100     0.56108  19.236  < 2e-16 ***
closed_forest                3.48703    0.64338     0.64347   5.419  1.0e-07 ***
cultivated                   9.95937    0.87880     0.87892  11.331  < 2e-16 ***
herbaceous_vegetation        8.97326    0.98504     0.98518   9.108  < 2e-16 ***
herbaceous_wetland          10.00181    2.83810     2.83851   3.524 0.000426 ***
mean_elevation_scaled       -3.43498    1.27445     1.27463   2.695 0.007041 ** 
number_of_checklists_scaled 19.74517    0.58407     0.58416  33.801  < 2e-16 ***
open_forest                 12.13158    0.89205     0.89218  13.598  < 2e-16 ***
permanent_water             -0.51126    0.63442     0.63447   0.806 0.420351    
realmAfrotropic              0.07749    1.21551     1.21568   0.064 0.949174    
realmAustralasia            -1.64760    1.86786     1.86813   0.882 0.377802    
realmIndomalayan            -2.89610    0.74686     0.74697   3.877 0.000106 ***
realmNearctic               -3.08571    0.83146     0.83158   3.711 0.000207 ***
realmNeotropic              -2.67969    0.88656     0.88669   3.022 0.002510 ** 
shrubs                       6.10974    1.29325     1.29344   4.724  2.3e-06 ***
elevation_delta_scaled       0.26239    0.58738     0.58745   0.447 0.655126    
urban                        0.07007    0.20080     0.20082   0.349 0.727156    
 
(conditional average) 
                            Estimate Std. Error Adjusted SE z value Pr(>|z|)    
(Intercept)                 10.79309    0.56100     0.56108  19.236  < 2e-16 ***
closed_forest                3.48703    0.64338     0.64347   5.419  1.0e-07 ***
cultivated                   9.95937    0.87880     0.87892  11.331  < 2e-16 ***
herbaceous_vegetation        8.97326    0.98504     0.98518   9.108  < 2e-16 ***
herbaceous_wetland          10.00181    2.83810     2.83851   3.524 0.000426 ***
mean_elevation_scaled       -3.43498    1.27445     1.27463   2.695 0.007041 ** 
number_of_checklists_scaled 19.74517    0.58407     0.58416  33.801  < 2e-16 ***
open_forest                 12.13158    0.89205     0.89218  13.598  < 2e-16 ***
permanent_water             -0.85325    0.61637     0.61645   1.384 0.166319    
realmAfrotropic              0.07749    1.21551     1.21568   0.064 0.949174    
realmAustralasia            -1.64760    1.86786     1.86813   0.882 0.377802    
realmIndomalayan            -2.89610    0.74686     0.74697   3.877 0.000106 ***
realmNearctic               -3.08571    0.83146     0.83158   3.711 0.000207 ***
realmNeotropic              -2.67969    0.88656     0.88669   3.022 0.002510 ** 
shrubs                       6.10974    1.29325     1.29344   4.724  2.3e-06 ***
elevation_delta_scaled       0.55247    0.75246     0.75257   0.734 0.462881    
urban                        0.24538    0.31334     0.31339   0.783 0.433635    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
either_mixed_model <- lmer(percentage_of_regional_pool_present ~ mean_elevation_scaled + closed_forest + cultivated + herbaceous_vegetation + herbaceous_wetland + open_forest + permanent_water + shrubs + realm + number_of_checklists_scaled + (1|city_name), either)
r.squaredGLMM(either_mixed_model)
           R2m       R2c
[1,] 0.1617725 0.4424337
either_fixed_model <- lm(percentage_of_regional_pool_present ~ mean_elevation_scaled + closed_forest + cultivated + herbaceous_vegetation + herbaceous_wetland + open_forest + permanent_water + shrubs + realm + number_of_checklists_scaled, either)
anova(either_mixed_model, either_fixed_model)
refitting model(s) with ML (instead of REML)
Data: either
Models:
either_fixed_model: percentage_of_regional_pool_present ~ mean_elevation_scaled + closed_forest + cultivated + herbaceous_vegetation + herbaceous_wetland + open_forest + permanent_water + shrubs + realm + number_of_checklists_scaled
either_mixed_model: percentage_of_regional_pool_present ~ mean_elevation_scaled + closed_forest + cultivated + herbaceous_vegetation + herbaceous_wetland + open_forest + permanent_water + shrubs + realm + number_of_checklists_scaled + (1 | city_name)
                   npar   AIC   BIC logLik deviance  Chisq Df Pr(>Chisq)    
either_fixed_model   16 48390 48503 -24179    48358                         
either_mixed_model   17 47567 47687 -23767    47533 824.93  1  < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
either_richness_sum <- model_summary('either', 'richness', either_richness_result)
either_richness_sum
either_city_response <- create_city_dataset(either_mixed_model)
Joining, by = "name"
either_city_response[order(either_city_response$response), c('name', 'response')]
write_csv(either_city_response[, c('name', 'response')], 'percentage_of_regional_richness__output__either_city_richness_intercept.csv')
Full result
richness_all <- full_join(full_join(merlin_richness_sum, bl_richness_sum), full_join(both_richness_sum, either_richness_sum))
Joining, by = c("explanatory", "model")Joining, by = c("explanatory", "model")Joining, by = c("explanatory", "model")
write_csv(richness_all, "percentage_of_regional_richness__output__richness_result.csv")
richness_all
Additional figures
library(tidyr)
library(ggplot2)
library(ggpubr)
environment <- merlin[,c('closed_forest', 'cultivated', 'herbaceous_vegetation', 'herbaceous_wetland', 'open_forest', 'permanent_water', 'shrubs', 'urban')]
names(environment) <- c('Closed Forest', 'Cultivated', 'Herbaceous Vegetation', 'Herbaceous Wetland', 'Open Forest', 'Permanent Water', 'Shurbs', 'Urban')
landcover <- gather(environment, landcover, proportion)

ggplot(landcover, aes(x = landcover, y = proportion)) + geom_boxplot() + xlab('Landcover Class') + ylab('Proportion in 5 km around sites') +
  scale_x_discrete(labels = scales::wrap_format(10)) + theme_bw() + labs(title = "Landcover Proportions")

ggsave("percentage_of_regional_richness__output__som_landcover_proportions.jpg")
Saving 7.29 x 4.51 in image

ggarrange(
  ggplot(merlin, aes(y = elevation_delta)) + geom_boxplot() + xlab('Elevation Delta') + ylab('Average Metres in 5 km around sites') +
    scale_x_discrete(labels = scales::wrap_format(10)) + theme_bw(),
  ggplot(merlin, aes(y = mean_elevation)) + geom_boxplot() + xlab('Mean Elevation') + ylab('Average Metres in 5 km around sites') +
    scale_x_discrete(labels = scales::wrap_format(10)) + theme_bw()
)

ggsave("percentage_of_regional_richness__output__som_elevations.jpg")
Saving 7.29 x 4.51 in image

Birdlife [300 or less checklists]: Difference in richness
birdlife300 = birdlife[birdlife$number_of_checklists <= 300,]
nrow(birdlife300)
[1] 7190
blr300_richness_result <- model_average_richness(birdlife300)
Warning: comparing models fitted by REMLFixed term is "(Intercept)"
blr300_richness_result

Call:
model.avg(object = dredge_result, subset = delta < aic_delta)

Component model call: 
lmer(formula = percentage_of_regional_pool_present ~ <6 unique rhs>, data = data)

Component models: 
                           df    logLik     AICc delta weight
1/2/3/4/5/6/7/8/9/10/11/12 19 -21709.04 43456.18  0.00   0.25
1/2/4/5/6/7/8/9/10/11/12   18 -21710.05 43456.19  0.02   0.25
1/2/3/4/5/6/7/8/9/10/11    18 -21710.39 43456.88  0.70   0.18
1/2/4/5/6/7/8/9/10/11      17 -21711.44 43456.97  0.80   0.17
1/2/4/5/6/7/8/10/11/12     17 -21712.27 43458.62  2.44   0.07
1/2/3/4/5/6/7/8/10/11/12   18 -21711.30 43458.69  2.52   0.07

Term codes: 
              closed_forest                  cultivated      elevation_delta_scaled       herbaceous_vegetation          herbaceous_wetland       mean_elevation_scaled 
                          1                           2                           3                           4                           5                           6 
number_of_checklists_scaled                 open_forest             permanent_water                       realm                      shrubs                       urban 
                          7                           8                           9                          10                          11                          12 

Model-averaged coefficients:  
(full average) 
                            Estimate Std. Error Adjusted SE z value Pr(>|z|)    
(Intercept)                  11.7790     0.7302      0.7304  16.128  < 2e-16 ***
closed_forest                 4.7008     0.8989      0.8990   5.229  2.0e-07 ***
cultivated                   12.3055     1.1979      1.1980  10.271  < 2e-16 ***
elevation_delta_scaled        0.2506     0.7329      0.7330   0.342 0.732465    
herbaceous_vegetation        11.5511     1.3443      1.3445   8.591  < 2e-16 ***
herbaceous_wetland           13.4647     3.7010      3.7016   3.638 0.000275 ***
mean_elevation_scaled        -3.4077     1.5165      1.5168   2.247 0.024661 *  
number_of_checklists_scaled  29.3514     1.9470      1.9473  15.073  < 2e-16 ***
open_forest                  18.2162     1.1871      1.1873  15.342  < 2e-16 ***
permanent_water              -1.5377     1.0807      1.0808   1.423 0.154819    
realmAfrotropic              -1.3731     1.3897      1.3900   0.988 0.323228    
realmAustralasia             -3.1636     2.0863      2.0866   1.516 0.129492    
realmIndomalayan             -4.2550     0.8470      0.8471   5.023  5.0e-07 ***
realmNearctic                -2.7905     0.9289      0.9291   3.003 0.002669 ** 
realmNeotropic               -4.1342     1.0078      1.0079   4.102  4.1e-05 ***
shrubs                        8.6184     1.6968      1.6971   5.078  4.0e-07 ***
urban                         0.4908     0.5013      0.5013   0.979 0.327582    
 
(conditional average) 
                            Estimate Std. Error Adjusted SE z value Pr(>|z|)    
(Intercept)                  11.7790     0.7302      0.7304  16.128  < 2e-16 ***
closed_forest                 4.7008     0.8989      0.8990   5.229  2.0e-07 ***
cultivated                   12.3055     1.1979      1.1980  10.271  < 2e-16 ***
elevation_delta_scaled        0.4973     0.9713      0.9714   0.512 0.608703    
herbaceous_vegetation        11.5511     1.3443      1.3445   8.591  < 2e-16 ***
herbaceous_wetland           13.4647     3.7010      3.7016   3.638 0.000275 ***
mean_elevation_scaled        -3.4077     1.5165      1.5168   2.247 0.024661 *  
number_of_checklists_scaled  29.3514     1.9470      1.9473  15.073  < 2e-16 ***
open_forest                  18.2162     1.1871      1.1873  15.342  < 2e-16 ***
permanent_water              -1.8020     0.9447      0.9448   1.907 0.056488 .  
realmAfrotropic              -1.3731     1.3897      1.3900   0.988 0.323228    
realmAustralasia             -3.1636     2.0863      2.0866   1.516 0.129492    
realmIndomalayan             -4.2550     0.8470      0.8471   5.023  5.0e-07 ***
realmNearctic                -2.7905     0.9289      0.9291   3.003 0.002669 ** 
realmNeotropic               -4.1342     1.0078      1.0079   4.102  4.1e-05 ***
shrubs                        8.6184     1.6968      1.6971   5.078  4.0e-07 ***
urban                         0.7533     0.4335      0.4335   1.738 0.082294 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
bl300_richness_sum <- model_summary('birdlife', 'richness', blr300_richness_result)
bl300_richness_sum
birdlife300_richness_plot <- bl300_richness_sum[bl300_richness_sum$model == 'full',]

birdlife300_richness_plot$explanatory <- factor(birdlife300_richness_plot$explanatory, levels = c('closed_forest', 'open_forest', 'shrubs', 'herbaceous_vegetation', 'herbaceous_wetland', 'permanent_water', 'cultivated', 'urban', 'mean_elevation_scaled', 'elevation_delta_scaled', 'realmAfrotropic', 'realmAustralasia', 'realmIndomalayan', 'realmNearctic', 'realmNeotropic', 'number_of_checklists_scaled'))
birdlife300_richness_plot$type <- 'Proportion of landcover\n5 km around site'
birdlife300_richness_plot$type[birdlife300_richness_plot$explanatory %in% c('mean_elevation_scaled', 'elevation_delta_scaled')] <- 'Scaled (0-1) average\nelevation 5 km around site'
birdlife300_richness_plot$type[birdlife300_richness_plot$explanatory %in% c('realmAfrotropic', 'realmAustralasia', 'realmIndomalayan', 'realmNearctic', 'realmNeotropic')] <- 'Realm'
birdlife300_richness_plot$type[birdlife300_richness_plot$explanatory %in% c('number_of_checklists_scaled')] <- 'Scaled (0 - 1) number\nof checklists'

birdlife300_plot = ggplot(birdlife300_richness_plot, aes(y=explanatory, x=richness_birdlife_estimate, colour = type)) + 
  geom_line() +
  geom_point()+
  geom_errorbar(aes(xmin=richness_birdlife_estimate-richness_birdlife_error, xmax=richness_birdlife_estimate+richness_birdlife_error), width=.2,
                 position=position_dodge(0.05)) +
  scale_y_discrete(
    limits = rev(levels(birdlife300_richness_plot$explanatory)), 
    labels = c('closed_forest' = 'Closed forest', 'open_forest' = 'Open forest', 'shrubs' = 'Shrubs', 'herbaceous_vegetation' = 'Herbaceous\nvegetation', 'herbaceous_wetland' = 'Herbaceous\nwetland', 'permanent_water' = 'Permanent\nwater', 'cultivated' = 'Cultivated', 'urban' = 'Urban', 'mean_elevation_scaled' = 'Mean elevation\nscaled', 'elevation_delta_scaled' = 'Elevation delta\nscaled', 'realmAfrotropic' = 'Afrotropical', 'realmAustralasia' = 'Austaliasian', 'realmIndomalayan' = 'Indomalayan', 'realmNearctic' = 'Nearctic', 'realmNeotropic' = 'Neotropical', 'number_of_checklists_scaled' = 'Sqrt number\nof checklists')) +
  theme_bw() +
  geom_vline(xintercept=0, linetype="dotted") +
  guides(colour=guide_legend(title="Predictor type")) + xlab('Increase in proportion of regional pool richness\n± Standard Error') + ylab('Predictor') +
  theme(legend.justification = "top")
birdlife300_plot
ggsave('percentage_of_regional_richness__output__birdlife_richness_300_checklists_or_less_result.jpg')
Saving 7.29 x 4.51 in image

Birdlife [No Australasia]: Difference in richness
birdlifeNoAustralia = birdlife[birdlife$realm != 'Australasia',]
nrow(birdlifeNoAustralia)
[1] 8014
blrNoAustralia_richness_result <- model_average_richness(birdlifeNoAustralia)
Warning: comparing models fitted by REMLFixed term is "(Intercept)"
blrNoAustralia_richness_result

Call:
model.avg(object = dredge_result, subset = delta < aic_delta)

Component model call: 
lmer(formula = percentage_of_regional_pool_present ~ <4 unique rhs>, data = data)

Component models: 
                           df    logLik     AICc delta weight
1/2/4/5/6/7/8/9/10/11      16 -24381.60 48795.26  0.00   0.36
1/2/3/4/5/6/7/8/9/10/11    17 -24380.71 48795.49  0.23   0.32
1/2/4/5/6/7/8/9/10/11/12   17 -24381.36 48796.80  1.54   0.17
1/2/3/4/5/6/7/8/9/10/11/12 18 -24380.48 48797.04  1.78   0.15

Term codes: 
              closed_forest                  cultivated      elevation_delta_scaled       herbaceous_vegetation          herbaceous_wetland       mean_elevation_scaled 
                          1                           2                           3                           4                           5                           6 
number_of_checklists_scaled                 open_forest             permanent_water                       realm                      shrubs                       urban 
                          7                           8                           9                          10                          11                          12 

Model-averaged coefficients:  
(full average) 
                            Estimate Std. Error Adjusted SE z value Pr(>|z|)    
(Intercept)                 12.47596    0.65663     0.65672  18.997  < 2e-16 ***
closed_forest                4.63809    0.82943     0.82955   5.591  < 2e-16 ***
cultivated                  11.60344    1.10345     1.10361  10.514  < 2e-16 ***
herbaceous_vegetation       10.41195    1.27598     1.27618   8.159  < 2e-16 ***
herbaceous_wetland          11.44994    3.58957     3.59011   3.189  0.00143 ** 
mean_elevation_scaled       -3.72351    1.50342     1.50364   2.476  0.01327 *  
number_of_checklists_scaled 24.96892    0.74474     0.74485  33.522  < 2e-16 ***
open_forest                 15.51587    1.13841     1.13858  13.627  < 2e-16 ***
permanent_water             -1.62990    0.78561     0.78572   2.074  0.03804 *  
realmAfrotropic             -1.37071    1.42023     1.42044   0.965  0.33455    
realmIndomalayan            -4.40896    0.86422     0.86435   5.101 3.00e-07 ***
realmNearctic               -2.63636    0.94943     0.94957   2.776  0.00550 ** 
realmNeotropic              -4.11584    1.02769     1.02785   4.004 6.22e-05 ***
shrubs                       9.54960    1.61915     1.61939   5.897  < 2e-16 ***
elevation_delta_scaled       0.10597    0.65561     0.65571   0.162  0.87161    
urban                        0.08344    0.26011     0.26014   0.321  0.74841    
 
(conditional average) 
                            Estimate Std. Error Adjusted SE z value Pr(>|z|)    
(Intercept)                  12.4760     0.6566      0.6567  18.997  < 2e-16 ***
closed_forest                 4.6381     0.8294      0.8296   5.591  < 2e-16 ***
cultivated                   11.6034     1.1034      1.1036  10.514  < 2e-16 ***
herbaceous_vegetation        10.4120     1.2760      1.2762   8.159  < 2e-16 ***
herbaceous_wetland           11.4499     3.5896      3.5901   3.189  0.00143 ** 
mean_elevation_scaled        -3.7235     1.5034      1.5036   2.476  0.01327 *  
number_of_checklists_scaled  24.9689     0.7447      0.7449  33.522  < 2e-16 ***
open_forest                  15.5159     1.1384      1.1386  13.627  < 2e-16 ***
permanent_water              -1.6299     0.7856      0.7857   2.074  0.03804 *  
realmAfrotropic              -1.3707     1.4202      1.4204   0.965  0.33455    
realmIndomalayan             -4.4090     0.8642      0.8644   5.101 3.00e-07 ***
realmNearctic                -2.6364     0.9494      0.9496   2.776  0.00550 ** 
realmNeotropic               -4.1158     1.0277      1.0278   4.004 6.22e-05 ***
shrubs                        9.5496     1.6191      1.6194   5.897  < 2e-16 ***
elevation_delta_scaled        0.2251     0.9414      0.9416   0.239  0.81103    
urban                         0.2641     0.4080      0.4080   0.647  0.51748    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
blNoAustralia_richness_sum <- model_summary('birdlife', 'richness', blrNoAustralia_richness_result)
blNoAustralia_richness_sum
birdlifeNoAustralia_richness_plot <- blNoAustralia_richness_sum[blNoAustralia_richness_sum$model == 'full',]

birdlifeNoAustralia_richness_plot$explanatory <- factor(birdlifeNoAustralia_richness_plot$explanatory, levels = c('closed_forest', 'open_forest', 'shrubs', 'herbaceous_vegetation', 'herbaceous_wetland', 'permanent_water', 'cultivated', 'urban', 'mean_elevation_scaled', 'elevation_delta_scaled', 'realmAfrotropic', 'realmAustralasia', 'realmIndomalayan', 'realmNearctic', 'realmNeotropic', 'number_of_checklists_scaled'))
birdlifeNoAustralia_richness_plot$type <- 'Proportion of landcover\n5 km around site'
birdlifeNoAustralia_richness_plot$type[birdlifeNoAustralia_richness_plot$explanatory %in% c('mean_elevation_scaled', 'elevation_delta_scaled')] <- 'Scaled (0-1) average\nelevation 5 km around site'
birdlifeNoAustralia_richness_plot$type[birdlifeNoAustralia_richness_plot$explanatory %in% c('realmAfrotropic', 'realmAustralasia', 'realmIndomalayan', 'realmNearctic', 'realmNeotropic')] <- 'Realm'
birdlifeNoAustralia_richness_plot$type[birdlifeNoAustralia_richness_plot$explanatory %in% c('number_of_checklists_scaled')] <- 'Scaled (0 - 1) number\nof checklists'

birdlifeNoAustralia_plot = ggplot(birdlifeNoAustralia_richness_plot, aes(y=explanatory, x=richness_birdlife_estimate, colour = type)) + 
  geom_line() +
  geom_point()+
  geom_errorbar(aes(xmin=richness_birdlife_estimate-richness_birdlife_error, xmax=richness_birdlife_estimate+richness_birdlife_error), width=.2,
                 position=position_dodge(0.05)) +
  scale_y_discrete(
    limits = rev(levels(birdlifeNoAustralia_richness_plot$explanatory)), 
    labels = c('closed_forest' = 'Closed forest', 'open_forest' = 'Open forest', 'shrubs' = 'Shrubs', 'herbaceous_vegetation' = 'Herbaceous\nvegetation', 'herbaceous_wetland' = 'Herbaceous\nwetland', 'permanent_water' = 'Permanent\nwater', 'cultivated' = 'Cultivated', 'urban' = 'Urban', 'mean_elevation_scaled' = 'Mean elevation\nscaled', 'elevation_delta_scaled' = 'Elevation delta\nscaled', 'realmAfrotropic' = 'Afrotropical', 'realmAustralasia' = 'Austaliasian', 'realmIndomalayan' = 'Indomalayan', 'realmNearctic' = 'Nearctic', 'realmNeotropic' = 'Neotropical', 'number_of_checklists_scaled' = 'Sqrt number\nof checklists')) +
  theme_bw() +
  geom_vline(xintercept=0, linetype="dotted") +
  guides(colour=guide_legend(title="Predictor type")) + xlab('Increase in proportion of regional pool richness\n± Standard Error') + ylab('Predictor') +
  theme(legend.justification = "top")
birdlifeNoAustralia_plot
ggsave('percentage_of_regional_richness__output__birdlife_richness_no_australia.jpg')
Saving 7.29 x 4.51 in image

Birdlife [No Afrotropics]: Difference in richness
birdlifeNoAfrica = birdlife[birdlife$realm != 'Afrotropic',]
nrow(birdlifeNoAfrica)
[1] 8385
blrNoAfrica_richness_result <- model_average_richness(birdlifeNoAfrica)
Warning: comparing models fitted by REMLFixed term is "(Intercept)"
blrNoAfrica_richness_result

Call:
model.avg(object = dredge_result, subset = delta < aic_delta)

Component model call: 
lmer(formula = percentage_of_regional_pool_present ~ <4 unique rhs>, data = data)

Component models: 
                           df    logLik     AICc delta weight
1/2/4/5/6/7/8/9/10/11      16 -25422.24 50876.54  0.00   0.36
1/2/3/4/5/6/7/8/9/10/11    17 -25421.29 50876.65  0.10   0.34
1/2/4/5/6/7/8/9/10/11/12   17 -25422.07 50878.22  1.67   0.16
1/2/3/4/5/6/7/8/9/10/11/12 18 -25421.13 50878.34  1.79   0.15

Term codes: 
              closed_forest                  cultivated      elevation_delta_scaled       herbaceous_vegetation          herbaceous_wetland       mean_elevation_scaled 
                          1                           2                           3                           4                           5                           6 
number_of_checklists_scaled                 open_forest             permanent_water                       realm                      shrubs                       urban 
                          7                           8                           9                          10                          11                          12 

Model-averaged coefficients:  
(full average) 
                            Estimate Std. Error Adjusted SE z value Pr(>|z|)    
(Intercept)                 12.39958    0.66378     0.66387  18.678  < 2e-16 ***
closed_forest                4.56883    0.80025     0.80037   5.708  < 2e-16 ***
cultivated                  11.11759    1.09826     1.09841  10.121  < 2e-16 ***
herbaceous_vegetation       11.98855    1.24148     1.24165   9.655  < 2e-16 ***
herbaceous_wetland          11.07292    3.54284     3.54335   3.125  0.00178 ** 
mean_elevation_scaled       -3.27277    1.60646     1.60669   2.037  0.04165 *  
number_of_checklists_scaled 25.05393    0.72773     0.72784  34.422  < 2e-16 ***
open_forest                 16.04934    1.11065     1.11081  14.448  < 2e-16 ***
permanent_water             -1.64144    0.77354     0.77365   2.122  0.03386 *  
realmAustralasia            -3.17949    2.18437     2.18469   1.455  0.14557    
realmIndomalayan            -4.32224    0.88038     0.88051   4.909 9.00e-07 ***
realmNearctic               -2.68378    0.97151     0.97165   2.762  0.00574 ** 
realmNeotropic              -4.26194    1.05094     1.05110   4.055 5.02e-05 ***
shrubs                       8.49079    1.61473     1.61496   5.258 1.00e-07 ***
elevation_delta_scaled       0.19823    0.68537     0.68546   0.289  0.77243    
urban                        0.06957    0.24221     0.24224   0.287  0.77398    
 
(conditional average) 
                            Estimate Std. Error Adjusted SE z value Pr(>|z|)    
(Intercept)                  12.3996     0.6638      0.6639  18.678  < 2e-16 ***
closed_forest                 4.5688     0.8003      0.8004   5.708  < 2e-16 ***
cultivated                   11.1176     1.0983      1.0984  10.121  < 2e-16 ***
herbaceous_vegetation        11.9886     1.2415      1.2417   9.655  < 2e-16 ***
herbaceous_wetland           11.0729     3.5428      3.5434   3.125  0.00178 ** 
mean_elevation_scaled        -3.2728     1.6065      1.6067   2.037  0.04165 *  
number_of_checklists_scaled  25.0539     0.7277      0.7278  34.422  < 2e-16 ***
open_forest                  16.0493     1.1106      1.1108  14.448  < 2e-16 ***
permanent_water              -1.6414     0.7735      0.7737   2.122  0.03386 *  
realmAustralasia             -3.1795     2.1844      2.1847   1.455  0.14557    
realmIndomalayan             -4.3222     0.8804      0.8805   4.909 9.00e-07 ***
realmNearctic                -2.6838     0.9715      0.9717   2.762  0.00574 ** 
realmNeotropic               -4.2619     1.0509      1.0511   4.055 5.02e-05 ***
shrubs                        8.4908     1.6147      1.6150   5.258 1.00e-07 ***
elevation_delta_scaled        0.4076     0.9383      0.9385   0.434  0.66406    
urban                         0.2308     0.3968      0.3968   0.582  0.56085    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
blNoAfrica_richness_sum = model_summary('birdlife', 'richness', blrNoAfrica_richness_result)
birdlifeNoAfrica_richness_plot <- blNoAfrica_richness_sum[blNoAfrica_richness_sum$model == 'full',]

birdlifeNoAfrica_richness_plot$explanatory <- factor(birdlifeNoAfrica_richness_plot$explanatory, levels = c('closed_forest', 'open_forest', 'shrubs', 'herbaceous_vegetation', 'herbaceous_wetland', 'permanent_water', 'cultivated', 'urban', 'mean_elevation_scaled', 'elevation_delta_scaled', 'realmAfrotropic', 'realmAustralasia', 'realmIndomalayan', 'realmNearctic', 'realmNeotropic', 'number_of_checklists_scaled'))
birdlifeNoAfrica_richness_plot$type <- 'Proportion of landcover\n5 km around site'
birdlifeNoAfrica_richness_plot$type[birdlifeNoAfrica_richness_plot$explanatory %in% c('mean_elevation_scaled', 'elevation_delta_scaled')] <- 'Scaled (0-1) average\nelevation 5 km around site'
birdlifeNoAfrica_richness_plot$type[birdlifeNoAfrica_richness_plot$explanatory %in% c('realmAfrotropic', 'realmAustralasia', 'realmIndomalayan', 'realmNearctic', 'realmNeotropic')] <- 'Realm'
birdlifeNoAfrica_richness_plot$type[birdlifeNoAfrica_richness_plot$explanatory %in% c('number_of_checklists_scaled')] <- 'Scaled (0 - 1) number\nof checklists'

birdlifeNoAfrica_plot = ggplot(birdlifeNoAfrica_richness_plot, aes(y=explanatory, x=richness_birdlife_estimate, colour = type)) + 
  geom_line() +
  geom_point()+
  geom_errorbar(aes(xmin=richness_birdlife_estimate-richness_birdlife_error, xmax=richness_birdlife_estimate+richness_birdlife_error), width=.2,
                 position=position_dodge(0.05)) +
  scale_y_discrete(
    limits = rev(levels(birdlifeNoAfrica_richness_plot$explanatory)), 
    labels = c('closed_forest' = 'Closed forest', 'open_forest' = 'Open forest', 'shrubs' = 'Shrubs', 'herbaceous_vegetation' = 'Herbaceous\nvegetation', 'herbaceous_wetland' = 'Herbaceous\nwetland', 'permanent_water' = 'Permanent\nwater', 'cultivated' = 'Cultivated', 'urban' = 'Urban', 'mean_elevation_scaled' = 'Mean elevation\nscaled', 'elevation_delta_scaled' = 'Elevation delta\nscaled', 'realmAfrotropic' = 'Afrotropical', 'realmAustralasia' = 'Austaliasian', 'realmIndomalayan' = 'Indomalayan', 'realmNearctic' = 'Nearctic', 'realmNeotropic' = 'Neotropical', 'number_of_checklists_scaled' = 'Sqrt number\nof checklists')) +
  theme_bw() +
  geom_vline(xintercept=0, linetype="dotted") +
  guides(colour=guide_legend(title="Predictor type")) + xlab('Increase in proportion of regional pool richness\n± Standard Error') + ylab('Predictor') +
  theme(legend.justification = "top")
birdlifeNoAfrica_plot
ggsave('percentage_of_regional_richness__output__birdlife_richness_no_africa.jpg')
Saving 7.29 x 4.51 in image

Birdlife [No Afrotropics and no Australisia]: Difference in richness
birdlifeNeitherAfrNorAus = birdlife[birdlife$realm != 'Afrotropic' & birdlife$realm != 'Australasia',]
nrow(birdlifeNeitherAfrNorAus)
[1] 7956
blrNAA_richness_result <- model_average_richness(birdlifeNeitherAfrNorAus)
Warning: comparing models fitted by REMLFixed term is "(Intercept)"
blrNAA_richness_result

Call:
model.avg(object = dredge_result, subset = delta < aic_delta)

Component model call: 
lmer(formula = percentage_of_regional_pool_present ~ <4 unique rhs>, data = data)

Component models: 
                           df    logLik     AICc delta weight
1/2/4/5/6/7/8/9/10/11      15 -24182.21 48394.49  0.00   0.38
1/2/3/4/5/6/7/8/9/10/11    16 -24181.34 48394.74  0.26   0.33
1/2/4/5/6/7/8/9/10/11/12   16 -24182.11 48396.28  1.79   0.15
1/2/3/4/5/6/7/8/9/10/11/12 17 -24181.23 48396.54  2.05   0.14

Term codes: 
              closed_forest                  cultivated      elevation_delta_scaled       herbaceous_vegetation          herbaceous_wetland       mean_elevation_scaled 
                          1                           2                           3                           4                           5                           6 
number_of_checklists_scaled                 open_forest             permanent_water                       realm                      shrubs                       urban 
                          7                           8                           9                          10                          11                          12 

Model-averaged coefficients:  
(full average) 
                            Estimate Std. Error Adjusted SE z value Pr(>|z|)    
(Intercept)                 12.47873    0.66382     0.66392  18.795  < 2e-16 ***
closed_forest                4.61632    0.82369     0.82382   5.604  < 2e-16 ***
cultivated                  11.39742    1.10640     1.10657  10.300  < 2e-16 ***
herbaceous_vegetation       10.81810    1.28914     1.28933   8.390  < 2e-16 ***
herbaceous_wetland          10.50456    3.59220     3.59275   2.924  0.00346 ** 
mean_elevation_scaled       -3.30266    1.61097     1.61122   2.050  0.04038 *  
number_of_checklists_scaled 24.94747    0.74290     0.74301  33.576  < 2e-16 ***
open_forest                 15.48966    1.13689     1.13707  13.622  < 2e-16 ***
permanent_water             -1.61680    0.77844     0.77855   2.077  0.03783 *  
realmIndomalayan            -4.37384    0.88300     0.88313   4.953 7.00e-07 ***
realmNearctic               -2.64602    0.97363     0.97378   2.717  0.00658 ** 
realmNeotropic              -4.20152    1.05432     1.05448   3.984 6.76e-05 ***
shrubs                       9.02543    1.62801     1.62826   5.543  < 2e-16 ***
elevation_delta_scaled       0.05651    0.65242     0.65252   0.087  0.93099    
urban                        0.04821    0.23246     0.23249   0.207  0.83571    
 
(conditional average) 
                            Estimate Std. Error Adjusted SE z value Pr(>|z|)    
(Intercept)                  12.4787     0.6638      0.6639  18.795  < 2e-16 ***
closed_forest                 4.6163     0.8237      0.8238   5.604  < 2e-16 ***
cultivated                   11.3974     1.1064      1.1066  10.300  < 2e-16 ***
herbaceous_vegetation        10.8181     1.2891      1.2893   8.390  < 2e-16 ***
herbaceous_wetland           10.5046     3.5922      3.5928   2.924  0.00346 ** 
mean_elevation_scaled        -3.3027     1.6110      1.6112   2.050  0.04038 *  
number_of_checklists_scaled  24.9475     0.7429      0.7430  33.576  < 2e-16 ***
open_forest                  15.4897     1.1369      1.1371  13.622  < 2e-16 ***
permanent_water              -1.6168     0.7784      0.7786   2.077  0.03783 *  
realmIndomalayan             -4.3738     0.8830      0.8831   4.953 7.00e-07 ***
realmNearctic                -2.6460     0.9736      0.9738   2.717  0.00658 ** 
realmNeotropic               -4.2015     1.0543      1.0545   3.984 6.76e-05 ***
shrubs                        9.0254     1.6280      1.6283   5.543  < 2e-16 ***
elevation_delta_scaled        0.1208     0.9498      0.9499   0.127  0.89882    
urban                         0.1665     0.4085      0.4086   0.407  0.68367    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
blNAA_richness_sum <- model_summary('birdlife', 'richness', blrNAA_richness_result)
blNAA_richness_sum
birdlifeNAA_richness_plot <- blNAA_richness_sum[blNAA_richness_sum$model == 'full',]

birdlifeNAA_richness_plot$explanatory <- factor(birdlifeNAA_richness_plot$explanatory, levels = c('closed_forest', 'open_forest', 'shrubs', 'herbaceous_vegetation', 'herbaceous_wetland', 'permanent_water', 'cultivated', 'urban', 'mean_elevation_scaled', 'elevation_delta_scaled', 'realmAfrotropic', 'realmAustralasia', 'realmIndomalayan', 'realmNearctic', 'realmNeotropic', 'number_of_checklists_scaled'))
birdlifeNAA_richness_plot$type <- 'Proportion of landcover\n5 km around site'
birdlifeNAA_richness_plot$type[birdlifeNAA_richness_plot$explanatory %in% c('mean_elevation_scaled', 'elevation_delta_scaled')] <- 'Scaled (0-1) average\nelevation 5 km around site'
birdlifeNAA_richness_plot$type[birdlifeNAA_richness_plot$explanatory %in% c('realmAfrotropic', 'realmAustralasia', 'realmIndomalayan', 'realmNearctic', 'realmNeotropic')] <- 'Realm'
birdlifeNAA_richness_plot$type[birdlifeNAA_richness_plot$explanatory %in% c('number_of_checklists_scaled')] <- 'Scaled (0 - 1) number\nof checklists'

birdlifeNAA_plot = ggplot(birdlifeNAA_richness_plot, aes(y=explanatory, x=richness_birdlife_estimate, colour = type)) + 
  geom_line() +
  geom_point()+
  geom_errorbar(aes(xmin=richness_birdlife_estimate-richness_birdlife_error, xmax=richness_birdlife_estimate+richness_birdlife_error), width=.2,
                 position=position_dodge(0.05)) +
  scale_y_discrete(
    limits = rev(levels(birdlifeNAA_richness_plot$explanatory)), 
    labels = c('closed_forest' = 'Closed forest', 'open_forest' = 'Open forest', 'shrubs' = 'Shrubs', 'herbaceous_vegetation' = 'Herbaceous\nvegetation', 'herbaceous_wetland' = 'Herbaceous\nwetland', 'permanent_water' = 'Permanent\nwater', 'cultivated' = 'Cultivated', 'urban' = 'Urban', 'mean_elevation_scaled' = 'Mean elevation\nscaled', 'elevation_delta_scaled' = 'Elevation delta\nscaled', 'realmAfrotropic' = 'Afrotropical', 'realmAustralasia' = 'Austaliasian', 'realmIndomalayan' = 'Indomalayan', 'realmNearctic' = 'Nearctic', 'realmNeotropic' = 'Neotropical', 'number_of_checklists_scaled' = 'Sqrt number\nof checklists')) +
  theme_bw() +
  geom_vline(xintercept=0, linetype="dotted") +
  guides(colour=guide_legend(title="Predictor type")) + xlab('Increase in proportion of regional pool richness\n± Standard Error') + ylab('Predictor') +
  theme(legend.justification = "top")
birdlifeNAA_plot
ggsave('percentage_of_regional_richness__output__birdlife_richness_no_africa_nor_australisia.jpg')
Saving 7.29 x 4.51 in image

Birdlife [Urban Only]: Difference in richness
birdlife$urban_rounded = floor(birdlife$urban * 10) / 10
ggplot(birdlife, aes(x = urban_rounded)) + geom_bar()

birdlifeHigherUrban = birdlife[birdlife$urban > 0.2,]
nrow(birdlifeHigherUrban)
[1] 8262
blrHigherUrban_richness_result <- model_average_richness(birdlifeHigherUrban)
Warning: comparing models fitted by REMLFixed term is "(Intercept)"
Warning: Model failed to converge with max|grad| = 0.00435943 (tol = 0.002, component 1)
blrHigherUrban_richness_result

Call:
model.avg(object = dredge_result, subset = delta < aic_delta)

Component model call: 
lmer(formula = percentage_of_regional_pool_present ~ <8 unique rhs>, data = data)

Component models: 
                           df    logLik     AICc delta weight
1/2/3/4/5/6/7/8/9/10/11    18 -25059.71 50155.49  0.00   0.19
1/2/4/5/6/7/8/9/10/11      17 -25060.76 50155.59  0.10   0.18
1/2/3/4/5/6/7/8/9/10/11/12 19 -25059.12 50156.34  0.84   0.12
1/2/4/5/6/7/8/9/10/11/12   18 -25060.15 50156.39  0.90   0.12
1/2/4/5/6/7/8/10/11/12     17 -25061.29 50156.65  1.16   0.11
1/2/3/4/5/6/7/8/10/11/12   18 -25060.29 50156.65  1.16   0.11
1/2/3/4/5/6/7/8/10/11      17 -25061.47 50157.02  1.53   0.09
1/2/4/5/6/7/8/10/11        16 -25062.49 50157.05  1.55   0.09

Term codes: 
              closed_forest                  cultivated      elevation_delta_scaled       herbaceous_vegetation          herbaceous_wetland       mean_elevation_scaled 
                          1                           2                           3                           4                           5                           6 
number_of_checklists_scaled                 open_forest             permanent_water                       realm                      shrubs                       urban 
                          7                           8                           9                          10                          11                          12 

Model-averaged coefficients:  
(full average) 
                            Estimate Std. Error Adjusted SE z value Pr(>|z|)    
(Intercept)                  12.0109     0.6931      0.6931  17.328  < 2e-16 ***
closed_forest                 4.8906     0.8534      0.8535   5.730  < 2e-16 ***
cultivated                   12.1076     1.1800      1.1801  10.259  < 2e-16 ***
elevation_delta_scaled        0.2824     0.7237      0.7238   0.390 0.696461    
herbaceous_vegetation        11.4514     1.2644      1.2646   9.055  < 2e-16 ***
herbaceous_wetland           11.7865     3.6101      3.6106   3.264 0.001097 ** 
mean_elevation_scaled        -3.9688     1.5221      1.5223   2.607 0.009134 ** 
number_of_checklists_scaled  24.8715     0.7373      0.7374  33.729  < 2e-16 ***
open_forest                  17.4451     1.1501      1.1502  15.167  < 2e-16 ***
permanent_water              -0.6019     0.8028      0.8029   0.750 0.453499    
realmAfrotropic              -0.6229     1.4407      1.4409   0.432 0.665529    
realmAustralasia             -3.0481     2.1240      2.1243   1.435 0.151329    
realmIndomalayan             -4.2920     0.8641      0.8642   4.967    7e-07 ***
realmNearctic                -2.5242     0.9463      0.9464   2.667 0.007648 ** 
realmNeotropic               -3.9439     1.0244      1.0245   3.849 0.000118 ***
shrubs                        9.1539     1.6543      1.6545   5.533  < 2e-16 ***
urban                         0.2357     0.3837      0.3838   0.614 0.539145    
 
(conditional average) 
                            Estimate Std. Error Adjusted SE z value Pr(>|z|)    
(Intercept)                  12.0109     0.6931      0.6931  17.328  < 2e-16 ***
closed_forest                 4.8906     0.8534      0.8535   5.730  < 2e-16 ***
cultivated                   12.1076     1.1800      1.1801  10.259  < 2e-16 ***
elevation_delta_scaled        0.5572     0.9383      0.9385   0.594 0.552689    
herbaceous_vegetation        11.4514     1.2644      1.2646   9.055  < 2e-16 ***
herbaceous_wetland           11.7865     3.6101      3.6106   3.264 0.001097 ** 
mean_elevation_scaled        -3.9688     1.5221      1.5223   2.607 0.009134 ** 
number_of_checklists_scaled  24.8715     0.7373      0.7374  33.729  < 2e-16 ***
open_forest                  17.4451     1.1501      1.1502  15.167  < 2e-16 ***
permanent_water              -0.9816     0.8237      0.8238   1.191 0.233477    
realmAfrotropic              -0.6229     1.4407      1.4409   0.432 0.665529    
realmAustralasia             -3.0481     2.1240      2.1243   1.435 0.151329    
realmIndomalayan             -4.2920     0.8641      0.8642   4.967    7e-07 ***
realmNearctic                -2.5242     0.9463      0.9464   2.667 0.007648 ** 
realmNeotropic               -3.9439     1.0244      1.0245   3.849 0.000118 ***
shrubs                        9.1539     1.6543      1.6545   5.533  < 2e-16 ***
urban                         0.5165     0.4215      0.4216   1.225 0.220493    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
blrHigherUrban_richness_sum <- model_summary('birdlife', 'richness', blrHigherUrban_richness_result)
blrHigherUrban_richness_sum
birdlifeHR_richness_plot <- blrHigherUrban_richness_sum[blrHigherUrban_richness_sum$model == 'full',]

birdlifeHR_richness_plot$explanatory <- factor(birdlifeHR_richness_plot$explanatory, levels = c('closed_forest', 'open_forest', 'shrubs', 'herbaceous_vegetation', 'herbaceous_wetland', 'permanent_water', 'cultivated', 'urban', 'mean_elevation_scaled', 'elevation_delta_scaled', 'realmAfrotropic', 'realmAustralasia', 'realmIndomalayan', 'realmNearctic', 'realmNeotropic', 'number_of_checklists_scaled'))
birdlifeHR_richness_plot$type <- 'Proportion of landcover\n5 km around site'
birdlifeHR_richness_plot$type[birdlifeHR_richness_plot$explanatory %in% c('mean_elevation_scaled', 'elevation_delta_scaled')] <- 'Scaled (0-1) average\nelevation 5 km around site'
birdlifeHR_richness_plot$type[birdlifeHR_richness_plot$explanatory %in% c('realmAfrotropic', 'realmAustralasia', 'realmIndomalayan', 'realmNearctic', 'realmNeotropic')] <- 'Realm'
birdlifeHR_richness_plot$type[birdlifeHR_richness_plot$explanatory %in% c('number_of_checklists_scaled')] <- 'Scaled (0 - 1) number\nof checklists'

birdlifeHR_plot = ggplot(birdlifeHR_richness_plot, aes(y=explanatory, x=richness_birdlife_estimate, colour = type)) + 
  geom_line() +
  geom_point()+
  geom_errorbar(aes(xmin=richness_birdlife_estimate-richness_birdlife_error, xmax=richness_birdlife_estimate+richness_birdlife_error), width=.2,
                 position=position_dodge(0.05)) +
  scale_y_discrete(
    limits = rev(levels(birdlifeHR_richness_plot$explanatory)), 
    labels = c('closed_forest' = 'Closed forest', 'open_forest' = 'Open forest', 'shrubs' = 'Shrubs', 'herbaceous_vegetation' = 'Herbaceous\nvegetation', 'herbaceous_wetland' = 'Herbaceous\nwetland', 'permanent_water' = 'Permanent\nwater', 'cultivated' = 'Cultivated', 'urban' = 'Urban', 'mean_elevation_scaled' = 'Mean elevation\nscaled', 'elevation_delta_scaled' = 'Elevation delta\nscaled', 'realmAfrotropic' = 'Afrotropical', 'realmAustralasia' = 'Austaliasian', 'realmIndomalayan' = 'Indomalayan', 'realmNearctic' = 'Nearctic', 'realmNeotropic' = 'Neotropical', 'number_of_checklists_scaled' = 'Sqrt number\nof checklists')) +
  theme_bw() +
  geom_vline(xintercept=0, linetype="dotted") +
  guides(colour=guide_legend(title="Predictor type")) + xlab('Increase in proportion of regional pool richness\n± Standard Error') + ylab('Predictor') +
  theme(legend.justification = "top")
birdlifeHR_plot
ggsave('percentage_of_regional_richness__output__birdlife_richness_higher_urban.jpg')
Saving 7.29 x 4.51 in image

Birdlife [Check pseudoreplication]: Difference in richness
locality_samples = read_csv('percentage_of_regional_richness__input__sampled_localities_min_distance_500m.csv')

── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  LOCALITY_ID = col_character(),
  SAMPLE_ID = col_double()
)
table(locality_samples$SAMPLE_ID)

   0    1    2    3    4    5    6    7    8    9 
7391 7377 7388 7387 7395 7380 7382 7391 7382 7381 
plot_sample = function(sample_id) {
  birdlife_sample0 = birdlife[birdlife$locality_id %in% locality_samples$LOCALITY_ID[locality_samples$SAMPLE_ID == sample_id],]
  
  birdlife_sample0_richness_result <- model_average_richness(birdlife_sample0)
  birdlife_sample0_richness_summary <- model_summary('birdlife', 'richness', birdlife_sample0_richness_result)
  
  birdlife_sample0_richness_plot <- birdlife_sample0_richness_summary[birdlife_sample0_richness_summary$model == 'full',]
  
  birdlife_sample0_richness_plot$explanatory <- factor(birdlife_sample0_richness_plot$explanatory, levels = c('closed_forest', 'open_forest', 'shrubs', 'herbaceous_vegetation', 'herbaceous_wetland', 'permanent_water', 'cultivated', 'urban', 'mean_elevation_scaled', 'elevation_delta_scaled', 'realmAfrotropic', 'realmAustralasia', 'realmIndomalayan', 'realmNearctic', 'realmNeotropic', 'number_of_checklists_scaled'))
  birdlife_sample0_richness_plot$type <- 'Proportion of landcover\n5 km around site'
  birdlife_sample0_richness_plot$type[birdlife_sample0_richness_plot$explanatory %in% c('mean_elevation_scaled', 'elevation_delta_scaled')] <- 'Scaled (0-1) average\nelevation 5 km around site'
  birdlife_sample0_richness_plot$type[birdlife_sample0_richness_plot$explanatory %in% c('realmAfrotropic', 'realmAustralasia', 'realmIndomalayan', 'realmNearctic', 'realmNeotropic')] <- 'Realm'
  birdlife_sample0_richness_plot$type[birdlife_sample0_richness_plot$explanatory %in% c('number_of_checklists_scaled')] <- 'Scaled (0 - 1) number\nof checklists'
  
  birdlifeSample0_plot = ggplot(birdlife_sample0_richness_plot, aes(y=explanatory, x=richness_birdlife_estimate, colour = type)) + 
    geom_line() +
    geom_point()+
    geom_errorbar(aes(xmin=richness_birdlife_estimate-richness_birdlife_error, xmax=richness_birdlife_estimate+richness_birdlife_error), width=.2,
                   position=position_dodge(0.05)) +
    scale_y_discrete(
      limits = rev(levels(birdlife_sample0_richness_plot$explanatory)), 
      labels = c('closed_forest' = 'Closed forest', 'open_forest' = 'Open forest', 'shrubs' = 'Shrubs', 'herbaceous_vegetation' = 'Herbaceous\nvegetation', 'herbaceous_wetland' = 'Herbaceous\nwetland', 'permanent_water' = 'Permanent\nwater', 'cultivated' = 'Cultivated', 'urban' = 'Urban', 'mean_elevation_scaled' = 'Mean elevation\nscaled', 'elevation_delta_scaled' = 'Elevation delta\nscaled', 'realmAfrotropic' = 'Afrotropical', 'realmAustralasia' = 'Austaliasian', 'realmIndomalayan' = 'Indomalayan', 'realmNearctic' = 'Nearctic', 'realmNeotropic' = 'Neotropical', 'number_of_checklists_scaled' = 'Sqrt number\nof checklists')) +
    theme_bw() +
    geom_vline(xintercept=0, linetype="dotted") +
    guides(colour=guide_legend(title="Predictor type")) + xlab('Increase in proportion of regional pool richness\n± Standard Error') + ylab('Predictor') +
    theme(legend.justification = "top")
  birdlifeSample0_plot
}
plot_sample('0')
Warning: comparing models fitted by REMLFixed term is "(Intercept)"
ggsave('percentage_of_regional_richness__output__birdlife_locality_sample0.jpg')
Saving 7.29 x 4.51 in image

plot_sample('1')
Warning: comparing models fitted by REMLFixed term is "(Intercept)"
ggsave('percentage_of_regional_richness__output__birdlife_locality_sample1.jpg')
Saving 7.29 x 4.51 in image

plot_sample('2')
Warning: comparing models fitted by REMLFixed term is "(Intercept)"
ggsave('percentage_of_regional_richness__output__birdlife_locality_sample2.jpg')
Saving 7.29 x 4.51 in image

plot_sample('3')
Warning: comparing models fitted by REMLFixed term is "(Intercept)"
ggsave('percentage_of_regional_richness__output__birdlife_locality_sample3.jpg')
Saving 7.29 x 4.51 in image

plot_sample('4')
Warning: comparing models fitted by REMLFixed term is "(Intercept)"
ggsave('percentage_of_regional_richness__output__birdlife_locality_sample4.jpg')
Saving 7.29 x 4.51 in image

plot_sample('5')
Warning: comparing models fitted by REMLFixed term is "(Intercept)"
ggsave('percentage_of_regional_richness__output__birdlife_locality_sample5.jpg')
Saving 7.29 x 4.51 in image

plot_sample('6')
Warning: comparing models fitted by REMLFixed term is "(Intercept)"
ggsave('percentage_of_regional_richness__output__birdlife_locality_sample6.jpg')
Saving 7.29 x 4.51 in image

plot_sample('7')
Warning: comparing models fitted by REMLFixed term is "(Intercept)"
ggsave('percentage_of_regional_richness__output__birdlife_locality_sample7.jpg')
Saving 7.29 x 4.51 in image

plot_sample('8')
Warning: comparing models fitted by REMLFixed term is "(Intercept)"
ggsave('percentage_of_regional_richness__output__birdlife_locality_sample8.jpg')
Saving 7.29 x 4.51 in image

plot_sample('9')
Warning: comparing models fitted by REMLFixed term is "(Intercept)"
ggsave('percentage_of_regional_richness__output__birdlife_locality_sample9.jpg')
Saving 7.29 x 4.51 in image

LS0tCnRpdGxlOiAiUGVyY2VudGFnZSBvZiBSZWdpb25hbCBSaWNobmVzcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKUnVuICdkb3dubG9hZF9kYXRhLlJtZGAgRmlyc3QhCgpgYGB7ciBzZXR1cH0Kb3B0aW9ucyhuYS5hY3Rpb24gPSAibmEuZmFpbCIpIAoKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZHBseXIpCgpzb3VyY2UoIi4vaGVscGVyX19kcmVkZ2VfZnVuY3Rpb25zLlIiKQpgYGAKCmBgYHtyfQptb2RlbF9hdmVyYWdlX3JpY2huZXNzIDwtIGZ1bmN0aW9uKGRhdGEpIHsKICBtb2RlbF9hdmVyYWdlKHBlcmNlbnRhZ2Vfb2ZfcmVnaW9uYWxfcG9vbF9wcmVzZW50IH4gbWVhbl9lbGV2YXRpb25fc2NhbGVkICsgZWxldmF0aW9uX2RlbHRhX3NjYWxlZCArIGNsb3NlZF9mb3Jlc3QgKyBjdWx0aXZhdGVkICsgaGVyYmFjZW91c192ZWdldGF0aW9uICsgaGVyYmFjZW91c193ZXRsYW5kICsgb3Blbl9mb3Jlc3QgKyBwZXJtYW5lbnRfd2F0ZXIgKyBzaHJ1YnMgKyB1cmJhbiArIHJlYWxtICsgbnVtYmVyX29mX2NoZWNrbGlzdHNfc2NhbGVkICsgKDF8Y2l0eV9uYW1lKSwgZGF0YSwgNCkKfQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KRmluZCBjaXR5IHByZWRpY3RvcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmNyZWF0ZV9jaXR5X2RhdGFzZXQgPC0gZnVuY3Rpb24obWl4ZWRfbW9kZWwpIHsKICBjaXR5X2NvZWVmcyA8LSByYW5lZihtaXhlZF9tb2RlbCkkY2l0eV9uYW1lCiAgY2l0eV9jb2VlZnMgPC0gY2JpbmQoY2l0eV9uYW1lID0gcm93bmFtZXMoY2l0eV9jb2VlZnMpLCBjaXR5X2NvZWVmcykKICByb3duYW1lcyhjaXR5X2NvZWVmcykgPC0gTlVMTAogIG5hbWVzKGNpdHlfY29lZWZzKSA8LSBjKCduYW1lJywgJ3Jlc3BvbnNlJykKICAKICBsZWZ0X2pvaW4oY2l0eV9jb2VlZnMsIGNpdHlfZGF0YSkKfQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KTWVybGluOiBEaWZmZXJlbmNlIGluIHJpY2huZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYGBge3IsIGNhY2hlID0gVFJVRX0KbWVybGluX3JpY2huZXNzX3Jlc3VsdCA8LSBtb2RlbF9hdmVyYWdlX3JpY2huZXNzKG1lcmxpbikKbWVybGluX3JpY2huZXNzX3Jlc3VsdApgYGAKCmBgYHtyfQptZXJsaW5fbWl4ZWRfbW9kZWwgPC0gbG1lcihwZXJjZW50YWdlX29mX3JlZ2lvbmFsX3Bvb2xfcHJlc2VudCB+IG1lYW5fZWxldmF0aW9uX3NjYWxlZCArIGVsZXZhdGlvbl9kZWx0YV9zY2FsZWQgKyBjbG9zZWRfZm9yZXN0ICsgY3VsdGl2YXRlZCArIGhlcmJhY2VvdXNfdmVnZXRhdGlvbiArIGhlcmJhY2VvdXNfd2V0bGFuZCArIG9wZW5fZm9yZXN0ICsgcGVybWFuZW50X3dhdGVyICsgc2hydWJzICsgcmVhbG0gKyBudW1iZXJfb2ZfY2hlY2tsaXN0c19zY2FsZWQgKyAoMXxjaXR5X25hbWUpLCBtZXJsaW4pCnIuc3F1YXJlZEdMTU0obWVybGluX21peGVkX21vZGVsKQpgYGAKCmBgYHtyfQptZXJsaW5fZml4ZWRfbW9kZWwgPC0gbG0ocGVyY2VudGFnZV9vZl9yZWdpb25hbF9wb29sX3ByZXNlbnQgfiBtZWFuX2VsZXZhdGlvbl9zY2FsZWQgKyBlbGV2YXRpb25fZGVsdGFfc2NhbGVkICsgY2xvc2VkX2ZvcmVzdCArIGN1bHRpdmF0ZWQgKyBoZXJiYWNlb3VzX3ZlZ2V0YXRpb24gKyBoZXJiYWNlb3VzX3dldGxhbmQgKyBvcGVuX2ZvcmVzdCArIHBlcm1hbmVudF93YXRlciArIHNocnVicyArIHJlYWxtICsgbnVtYmVyX29mX2NoZWNrbGlzdHNfc2NhbGVkLCBtZXJsaW4pCmFub3ZhKG1lcmxpbl9taXhlZF9tb2RlbCwgbWVybGluX2ZpeGVkX21vZGVsKQpgYGAKCmBgYHtyfQphbm92YShtZXJsaW5fbWl4ZWRfbW9kZWwsIGxtKHBlcmNlbnRhZ2Vfb2ZfcmVnaW9uYWxfcG9vbF9wcmVzZW50IH4gY2l0eV9uYW1lLCBtZXJsaW4pKQpgYGAKCgpgYGB7cn0KbWVybGluX3JpY2huZXNzX3N1bSA8LSBtb2RlbF9zdW1tYXJ5KCdtZXJsaW4nLCAncmljaG5lc3MnLCBtZXJsaW5fcmljaG5lc3NfcmVzdWx0KQptZXJsaW5fcmljaG5lc3Nfc3VtCmBgYAoKYGBge3J9Cm1lcmxpbl9jaXR5X3Jlc3BvbnNlIDwtIGNyZWF0ZV9jaXR5X2RhdGFzZXQobWVybGluX21peGVkX21vZGVsKQptZXJsaW5fY2l0eV9yZXNwb25zZVtvcmRlcihtZXJsaW5fY2l0eV9yZXNwb25zZSRyZXNwb25zZSksIGMoJ25hbWUnLCAncmVzcG9uc2UnKV0KYGBgCgpgYGB7cn0Kd3JpdGVfY3N2KG1lcmxpbl9jaXR5X3Jlc3BvbnNlWywgYygnbmFtZScsICdyZXNwb25zZScpXSwgJ3BlcmNlbnRhZ2Vfb2ZfcmVnaW9uYWxfcmljaG5lc3NfX291dHB1dF9fbWVybGluX2NpdHlfcmljaG5lc3NfaW50ZXJjZXB0LmNzdicpCmBgYAoKCmBgYHtyfQpzdW1tYXJ5KG1lcmxpbl9taXhlZF9tb2RlbCkKYGBgCgpgYGB7cn0KbWVybGluX3JpY2huZXNzX3Bsb3QgPC0gbWVybGluX3JpY2huZXNzX3N1bVttZXJsaW5fcmljaG5lc3Nfc3VtJG1vZGVsID09ICdmdWxsJyxdCm1lcmxpbl9yaWNobmVzc19wbG90JGV4cGxhbmF0b3J5IDwtIGZhY3RvcihtZXJsaW5fcmljaG5lc3NfcGxvdCRleHBsYW5hdG9yeSwgbGV2ZWxzID0gYygnY2xvc2VkX2ZvcmVzdCcsICdvcGVuX2ZvcmVzdCcsICdzaHJ1YnMnLCAnaGVyYmFjZW91c192ZWdldGF0aW9uJywgJ2hlcmJhY2VvdXNfd2V0bGFuZCcsICdwZXJtYW5lbnRfd2F0ZXInLCAnY3VsdGl2YXRlZCcsICd1cmJhbicsICdtZWFuX2VsZXZhdGlvbl9zY2FsZWQnLCAnZWxldmF0aW9uX2RlbHRhX3NjYWxlZCcsICdyZWFsbUFmcm90cm9waWMnLCAncmVhbG1BdXN0cmFsYXNpYScsICdyZWFsbUluZG9tYWxheWFuJywgJ3JlYWxtTmVhcmN0aWMnLCAncmVhbG1OZW90cm9waWMnLCAnbnVtYmVyX29mX2NoZWNrbGlzdHNfc2NhbGVkJykpCm1lcmxpbl9yaWNobmVzc19wbG90JHR5cGUgPC0gJ1Byb3BvcnRpb24gb2YgbGFuZGNvdmVyXG41IGttIGFyb3VuZCBzaXRlJwptZXJsaW5fcmljaG5lc3NfcGxvdCR0eXBlW21lcmxpbl9yaWNobmVzc19wbG90JGV4cGxhbmF0b3J5ICVpbiUgYygnbWVhbl9lbGV2YXRpb25fc2NhbGVkJywgJ2VsZXZhdGlvbl9kZWx0YV9zY2FsZWQnKV0gPC0gJ1NjYWxlZCAoMC0xKSBhdmVyYWdlXG5lbGV2YXRpb24gNSBrbSBhcm91bmQgc2l0ZScKbWVybGluX3JpY2huZXNzX3Bsb3QkdHlwZVttZXJsaW5fcmljaG5lc3NfcGxvdCRleHBsYW5hdG9yeSAlaW4lIGMoJ3JlYWxtQWZyb3Ryb3BpYycsICdyZWFsbUF1c3RyYWxhc2lhJywgJ3JlYWxtSW5kb21hbGF5YW4nLCAncmVhbG1OZWFyY3RpYycsICdyZWFsbU5lb3Ryb3BpYycpXSA8LSAnUmVhbG0nCm1lcmxpbl9yaWNobmVzc19wbG90JHR5cGVbbWVybGluX3JpY2huZXNzX3Bsb3QkZXhwbGFuYXRvcnkgJWluJSBjKCdudW1iZXJfb2ZfY2hlY2tsaXN0c19zY2FsZWQnKV0gPC0gJ1NjYWxlZCAoMCAtIDEpIG51bWJlclxub2YgY2hlY2tsaXN0cycKCmdncGxvdChtZXJsaW5fcmljaG5lc3NfcGxvdCwgYWVzKHk9ZXhwbGFuYXRvcnksIHg9cmljaG5lc3NfbWVybGluX2VzdGltYXRlLCBjb2xvdXIgPSB0eXBlKSkgKyAKICBnZW9tX2xpbmUoKSArCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fZXJyb3JiYXIoYWVzKHhtaW49cmljaG5lc3NfbWVybGluX2VzdGltYXRlLXJpY2huZXNzX21lcmxpbl9lcnJvciwgeG1heD1yaWNobmVzc19tZXJsaW5fZXN0aW1hdGUrcmljaG5lc3NfbWVybGluX2Vycm9yKSwgd2lkdGg9LjIsCiAgICAgICAgICAgICAgICAgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC4wNSkpICsKICBzY2FsZV95X2Rpc2NyZXRlKAogICAgbGltaXRzID0gcmV2KGxldmVscyhtZXJsaW5fcmljaG5lc3NfcGxvdCRleHBsYW5hdG9yeSkpLCAKICAgIGxhYmVscyA9IGMoJ2Nsb3NlZF9mb3Jlc3QnID0gJ0Nsb3NlZCBmb3Jlc3QnLCAnb3Blbl9mb3Jlc3QnID0gJ09wZW4gZm9yZXN0JywgJ3NocnVicycgPSAnU2hydWJzJywgJ2hlcmJhY2VvdXNfdmVnZXRhdGlvbicgPSAnSGVyYmFjZW91c1xudmVnZXRhdGlvbicsICdoZXJiYWNlb3VzX3dldGxhbmQnID0gJ0hlcmJhY2VvdXNcbndldGxhbmQnLCAncGVybWFuZW50X3dhdGVyJyA9ICdQZXJtYW5lbnRcbndhdGVyJywgJ2N1bHRpdmF0ZWQnID0gJ0N1bHRpdmF0ZWQnLCAndXJiYW4nID0gJ1VyYmFuJywgJ21lYW5fZWxldmF0aW9uX3NjYWxlZCcgPSAnTWVhbiBlbGV2YXRpb25cbnNjYWxlZCcsICdlbGV2YXRpb25fZGVsdGFfc2NhbGVkJyA9ICdFbGV2YXRpb24gZGVsdGFcbnNjYWxlZCcsICdyZWFsbUFmcm90cm9waWMnID0gJ0Fmcm90cm9waWNhbCcsICdyZWFsbUF1c3RyYWxhc2lhJyA9ICdBdXN0YWxpYXNpYW4nLCAncmVhbG1JbmRvbWFsYXlhbicgPSAnSW5kb21hbGF5YW4nLCAncmVhbG1OZWFyY3RpYycgPSAnTmVhcmN0aWMnLCAncmVhbG1OZW90cm9waWMnID0gJ05lb3Ryb3BpY2FsJywgJ251bWJlcl9vZl9jaGVja2xpc3RzX3NjYWxlZCcgPSAnU3FydCBudW1iZXJcbm9mIGNoZWNrbGlzdHMnKSkgKwogIHRoZW1lX2J3KCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZG90dGVkIikgKwogIGd1aWRlcyhjb2xvdXI9Z3VpZGVfbGVnZW5kKHRpdGxlPSJQcmVkaWN0b3IgdHlwZSIpKSArIHhsYWIoJ0luY3JlYXNlIGluIHByb3BvcnRpb24gb2YgcmVnaW9uYWwgcmljaG5lc3NcbsKxIFN0YW5kYXJkIEVycm9yJykgKyB5bGFiKCdQcmVkaWN0b3InKSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSAidG9wIikKCmdnc2F2ZSgncGVyY2VudGFnZV9vZl9yZWdpb25hbF9wb29sX19vdXRwdXRfX21lcmxpbl9yaWNobmVzc19yZXN1bHQuanBnJykKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkJpcmRsaWZlOiBEaWZmZXJlbmNlIGluIHJpY2huZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYGBge3IsIGNhY2hlID0gVFJVRX0KYmxfcmljaG5lc3NfcmVzdWx0IDwtIG1vZGVsX2F2ZXJhZ2VfcmljaG5lc3MoYmlyZGxpZmUpCmJsX3JpY2huZXNzX3Jlc3VsdApgYGAKCmBgYHtyfQpiaXJkbGlmZV9taXhlZF9tb2RlbCA8LSBsbWVyKHBlcmNlbnRhZ2Vfb2ZfcmVnaW9uYWxfcG9vbF9wcmVzZW50IH4gbWVhbl9lbGV2YXRpb25fc2NhbGVkICsgY2xvc2VkX2ZvcmVzdCArIGN1bHRpdmF0ZWQgKyBoZXJiYWNlb3VzX3ZlZ2V0YXRpb24gKyBoZXJiYWNlb3VzX3dldGxhbmQgKyBvcGVuX2ZvcmVzdCArIHNocnVicyArIHJlYWxtICsgKDF8Y2l0eV9uYW1lKSwgYmlyZGxpZmUpCnIuc3F1YXJlZEdMTU0oYmlyZGxpZmVfbWl4ZWRfbW9kZWwpCmBgYAoKYGBge3J9CnN1bW1hcnkoYmlyZGxpZmVfbWl4ZWRfbW9kZWwpCmBgYAoKYGBge3J9CmJpcmRsaWZlX2ZpeGVkX21vZGVsIDwtIGxtKHBlcmNlbnRhZ2Vfb2ZfcmVnaW9uYWxfcG9vbF9wcmVzZW50IH4gbWVhbl9lbGV2YXRpb25fc2NhbGVkICsgY2xvc2VkX2ZvcmVzdCArIGN1bHRpdmF0ZWQgKyBoZXJiYWNlb3VzX3ZlZ2V0YXRpb24gKyBoZXJiYWNlb3VzX3dldGxhbmQgKyBvcGVuX2ZvcmVzdCArIHNocnVicyArIHJlYWxtLCBiaXJkbGlmZSkKYW5vdmEoYmlyZGxpZmVfbWl4ZWRfbW9kZWwsIGJpcmRsaWZlX2ZpeGVkX21vZGVsKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KGJpcmRsaWZlX2ZpeGVkX21vZGVsKQpgYGAKCmBgYHtyfQpiaXJkbGlmZV9jaXR5X3Jlc3BvbnNlIDwtIGNyZWF0ZV9jaXR5X2RhdGFzZXQoYmlyZGxpZmVfbWl4ZWRfbW9kZWwpCmJpcmRsaWZlX2NpdHlfcmVzcG9uc2Vbb3JkZXIoYmlyZGxpZmVfY2l0eV9yZXNwb25zZSRyZXNwb25zZSksIGMoJ25hbWUnLCAncmVzcG9uc2UnKV0KYGBgCgpgYGB7cn0Kd3JpdGVfY3N2KGJpcmRsaWZlX2NpdHlfcmVzcG9uc2VbLCBjKCduYW1lJywgJ3Jlc3BvbnNlJyldLCAncGVyY2VudGFnZV9vZl9yZWdpb25hbF9yaWNobmVzc19fb3V0cHV0X19iaXJkbGlmZV9jaXR5X3JpY2huZXNzX2ludGVyY2VwdC5jc3YnKQpgYGAKCgpgYGB7cn0KYmxfcmljaG5lc3Nfc3VtIDwtIG1vZGVsX3N1bW1hcnkoJ2JpcmRsaWZlJywgJ3JpY2huZXNzJywgYmxfcmljaG5lc3NfcmVzdWx0KQpibF9yaWNobmVzc19zdW0KYGBgCgpgYGB7cn0Kc3VtbWFyeShiaXJkbGlmZV9taXhlZF9tb2RlbCkKYGBgCgpgYGB7cn0KYmlyZGxpZmVfcmljaG5lc3NfcGxvdCA8LSBibF9yaWNobmVzc19zdW1bYmxfcmljaG5lc3Nfc3VtJG1vZGVsID09ICdmdWxsJyxdCmJpcmRsaWZlX3JpY2huZXNzX3Bsb3QkZXhwbGFuYXRvcnkgPC0gZmFjdG9yKGJpcmRsaWZlX3JpY2huZXNzX3Bsb3QkZXhwbGFuYXRvcnksIGxldmVscyA9IGMoJ2Nsb3NlZF9mb3Jlc3QnLCAnb3Blbl9mb3Jlc3QnLCAnc2hydWJzJywgJ2hlcmJhY2VvdXNfdmVnZXRhdGlvbicsICdoZXJiYWNlb3VzX3dldGxhbmQnLCAncGVybWFuZW50X3dhdGVyJywgJ2N1bHRpdmF0ZWQnLCAndXJiYW4nLCAnbWVhbl9lbGV2YXRpb25fc2NhbGVkJywgJ2VsZXZhdGlvbl9kZWx0YV9zY2FsZWQnLCAncmVhbG1BZnJvdHJvcGljJywgJ3JlYWxtQXVzdHJhbGFzaWEnLCAncmVhbG1JbmRvbWFsYXlhbicsICdyZWFsbU5lYXJjdGljJywgJ3JlYWxtTmVvdHJvcGljJywgJ251bWJlcl9vZl9jaGVja2xpc3RzX3NjYWxlZCcpKQpiaXJkbGlmZV9yaWNobmVzc19wbG90JHR5cGUgPC0gJ1Byb3BvcnRpb24gb2YgbGFuZGNvdmVyXG41IGttIGFyb3VuZCBzaXRlJwpiaXJkbGlmZV9yaWNobmVzc19wbG90JHR5cGVbYmlyZGxpZmVfcmljaG5lc3NfcGxvdCRleHBsYW5hdG9yeSAlaW4lIGMoJ21lYW5fZWxldmF0aW9uX3NjYWxlZCcsICdlbGV2YXRpb25fZGVsdGFfc2NhbGVkJyldIDwtICdTY2FsZWQgKDAtMSkgYXZlcmFnZVxuZWxldmF0aW9uIDUga20gYXJvdW5kIHNpdGUnCmJpcmRsaWZlX3JpY2huZXNzX3Bsb3QkdHlwZVtiaXJkbGlmZV9yaWNobmVzc19wbG90JGV4cGxhbmF0b3J5ICVpbiUgYygncmVhbG1BZnJvdHJvcGljJywgJ3JlYWxtQXVzdHJhbGFzaWEnLCAncmVhbG1JbmRvbWFsYXlhbicsICdyZWFsbU5lYXJjdGljJywgJ3JlYWxtTmVvdHJvcGljJyldIDwtICdSZWFsbScKYmlyZGxpZmVfcmljaG5lc3NfcGxvdCR0eXBlW2JpcmRsaWZlX3JpY2huZXNzX3Bsb3QkZXhwbGFuYXRvcnkgJWluJSBjKCdudW1iZXJfb2ZfY2hlY2tsaXN0c19zY2FsZWQnKV0gPC0gJ1NjYWxlZCAoMCAtIDEpIG51bWJlclxub2YgY2hlY2tsaXN0cycKCmJpcmRsaWZlX3Bsb3QgPSBnZ3Bsb3QoYmlyZGxpZmVfcmljaG5lc3NfcGxvdCwgYWVzKHk9ZXhwbGFuYXRvcnksIHg9cmljaG5lc3NfYmlyZGxpZmVfZXN0aW1hdGUsIGNvbG91ciA9IHR5cGUpKSArIAogIGdlb21fbGluZSgpICsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9lcnJvcmJhcihhZXMoeG1pbj1yaWNobmVzc19iaXJkbGlmZV9lc3RpbWF0ZS1yaWNobmVzc19iaXJkbGlmZV9lcnJvciwgeG1heD1yaWNobmVzc19iaXJkbGlmZV9lc3RpbWF0ZStyaWNobmVzc19iaXJkbGlmZV9lcnJvciksIHdpZHRoPS4yLAogICAgICAgICAgICAgICAgIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuMDUpKSArCiAgc2NhbGVfeV9kaXNjcmV0ZSgKICAgIGxpbWl0cyA9IHJldihsZXZlbHMoYmlyZGxpZmVfcmljaG5lc3NfcGxvdCRleHBsYW5hdG9yeSkpLCAKICAgIGxhYmVscyA9IGMoJ2Nsb3NlZF9mb3Jlc3QnID0gJ0Nsb3NlZCBmb3Jlc3QnLCAnb3Blbl9mb3Jlc3QnID0gJ09wZW4gZm9yZXN0JywgJ3NocnVicycgPSAnU2hydWJzJywgJ2hlcmJhY2VvdXNfdmVnZXRhdGlvbicgPSAnSGVyYmFjZW91c1xudmVnZXRhdGlvbicsICdoZXJiYWNlb3VzX3dldGxhbmQnID0gJ0hlcmJhY2VvdXNcbndldGxhbmQnLCAncGVybWFuZW50X3dhdGVyJyA9ICdQZXJtYW5lbnRcbndhdGVyJywgJ2N1bHRpdmF0ZWQnID0gJ0N1bHRpdmF0ZWQnLCAndXJiYW4nID0gJ1VyYmFuJywgJ21lYW5fZWxldmF0aW9uX3NjYWxlZCcgPSAnTWVhbiBlbGV2YXRpb25cbnNjYWxlZCcsICdlbGV2YXRpb25fZGVsdGFfc2NhbGVkJyA9ICdFbGV2YXRpb24gZGVsdGFcbnNjYWxlZCcsICdyZWFsbUFmcm90cm9waWMnID0gJ0Fmcm90cm9waWNhbCcsICdyZWFsbUF1c3RyYWxhc2lhJyA9ICdBdXN0YWxpYXNpYW4nLCAncmVhbG1JbmRvbWFsYXlhbicgPSAnSW5kb21hbGF5YW4nLCAncmVhbG1OZWFyY3RpYycgPSAnTmVhcmN0aWMnLCAncmVhbG1OZW90cm9waWMnID0gJ05lb3Ryb3BpY2FsJywgJ251bWJlcl9vZl9jaGVja2xpc3RzX3NjYWxlZCcgPSAnU3FydCBudW1iZXJcbm9mIGNoZWNrbGlzdHMnKSkgKwogIHRoZW1lX2J3KCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZG90dGVkIikgKwogIGd1aWRlcyhjb2xvdXI9Z3VpZGVfbGVnZW5kKHRpdGxlPSJQcmVkaWN0b3IgdHlwZSIpKSArIHhsYWIoJ0luY3JlYXNlIGluIHByb3BvcnRpb24gb2YgcmVnaW9uYWwgcG9vbCByaWNobmVzc1xuwrEgU3RhbmRhcmQgRXJyb3InKSArIHlsYWIoJ1ByZWRpY3RvcicpICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9ICJ0b3AiKQpiaXJkbGlmZV9wbG90Cmdnc2F2ZSgncGVyY2VudGFnZV9vZl9yZWdpb25hbF9wb29sX19vdXRwdXRfX2JpcmRsaWZlX3JpY2huZXNzX3Jlc3VsdC5qcGcnKQpgYGAKCgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpCb3RoOiBEaWZmZXJlbmNlIGluIHJpY2huZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYGBge3IsIGNhY2hlID0gVFJVRX0KYm90aF9yaWNobmVzc19yZXN1bHQgPC0gbW9kZWxfYXZlcmFnZV9yaWNobmVzcyhib3RoKQpib3RoX3JpY2huZXNzX3Jlc3VsdApgYGAKCmBgYHtyfQpib3RoX21peGVkX21vZGVsIDwtIGxtZXIocGVyY2VudGFnZV9vZl9yZWdpb25hbF9wb29sX3ByZXNlbnQgfiBtZWFuX2VsZXZhdGlvbl9zY2FsZWQgKyBlbGV2YXRpb25fZGVsdGFfc2NhbGVkICsgY2xvc2VkX2ZvcmVzdCArIGN1bHRpdmF0ZWQgKyBoZXJiYWNlb3VzX3ZlZ2V0YXRpb24gKyBoZXJiYWNlb3VzX3dldGxhbmQgKyBvcGVuX2ZvcmVzdCArIHBlcm1hbmVudF93YXRlciArIHNocnVicyArIHJlYWxtICsgbnVtYmVyX29mX2NoZWNrbGlzdHNfc2NhbGVkICsgKDF8Y2l0eV9uYW1lKSwgYm90aCkKci5zcXVhcmVkR0xNTShib3RoX21peGVkX21vZGVsKQpgYGAKCmBgYHtyfQpib3RoX2ZpeGVkX21vZGVsIDwtIGxtKHBlcmNlbnRhZ2Vfb2ZfcmVnaW9uYWxfcG9vbF9wcmVzZW50IH4gbWVhbl9lbGV2YXRpb25fc2NhbGVkICsgZWxldmF0aW9uX2RlbHRhX3NjYWxlZCArIGNsb3NlZF9mb3Jlc3QgKyBjdWx0aXZhdGVkICsgaGVyYmFjZW91c192ZWdldGF0aW9uICsgaGVyYmFjZW91c193ZXRsYW5kICsgb3Blbl9mb3Jlc3QgKyBwZXJtYW5lbnRfd2F0ZXIgKyBzaHJ1YnMgKyByZWFsbSArIG51bWJlcl9vZl9jaGVja2xpc3RzX3NjYWxlZCwgYm90aCkKYW5vdmEoYm90aF9taXhlZF9tb2RlbCwgYm90aF9maXhlZF9tb2RlbCkKYGBgCgpgYGB7cn0KYm90aF9yaWNobmVzc19zdW0gPC0gbW9kZWxfc3VtbWFyeSgnYm90aCcsICdyaWNobmVzcycsIGJvdGhfcmljaG5lc3NfcmVzdWx0KQpib3RoX3JpY2huZXNzX3N1bQpgYGAKCmBgYHtyfQpib3RoX2NpdHlfcmVzcG9uc2UgPC0gY3JlYXRlX2NpdHlfZGF0YXNldChib3RoX21peGVkX21vZGVsKQpib3RoX2NpdHlfcmVzcG9uc2Vbb3JkZXIoYm90aF9jaXR5X3Jlc3BvbnNlJHJlc3BvbnNlKSwgYygnbmFtZScsICdyZXNwb25zZScpXQpgYGAKCmBgYHtyfQp3cml0ZV9jc3YoYm90aF9jaXR5X3Jlc3BvbnNlWywgYygnbmFtZScsICdyZXNwb25zZScpXSwgJ3BlcmNlbnRhZ2Vfb2ZfcmVnaW9uYWxfcmljaG5lc3NfX291dHB1dF9fYm90aF9jaXR5X3JpY2huZXNzX2ludGVyY2VwdC5jc3YnKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KRWl0aGVyOiBEaWZmZXJlbmNlIGluIHJpY2huZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYGBge3IsIGNhY2hlID0gVFJVRX0KZWl0aGVyX3JpY2huZXNzX3Jlc3VsdCA8LSBtb2RlbF9hdmVyYWdlX3JpY2huZXNzKGVpdGhlcikKZWl0aGVyX3JpY2huZXNzX3Jlc3VsdApgYGAKCmBgYHtyfQplaXRoZXJfbWl4ZWRfbW9kZWwgPC0gbG1lcihwZXJjZW50YWdlX29mX3JlZ2lvbmFsX3Bvb2xfcHJlc2VudCB+IG1lYW5fZWxldmF0aW9uX3NjYWxlZCArIGNsb3NlZF9mb3Jlc3QgKyBjdWx0aXZhdGVkICsgaGVyYmFjZW91c192ZWdldGF0aW9uICsgaGVyYmFjZW91c193ZXRsYW5kICsgb3Blbl9mb3Jlc3QgKyBwZXJtYW5lbnRfd2F0ZXIgKyBzaHJ1YnMgKyByZWFsbSArIG51bWJlcl9vZl9jaGVja2xpc3RzX3NjYWxlZCArICgxfGNpdHlfbmFtZSksIGVpdGhlcikKci5zcXVhcmVkR0xNTShlaXRoZXJfbWl4ZWRfbW9kZWwpCmBgYAoKYGBge3J9CmVpdGhlcl9maXhlZF9tb2RlbCA8LSBsbShwZXJjZW50YWdlX29mX3JlZ2lvbmFsX3Bvb2xfcHJlc2VudCB+IG1lYW5fZWxldmF0aW9uX3NjYWxlZCArIGNsb3NlZF9mb3Jlc3QgKyBjdWx0aXZhdGVkICsgaGVyYmFjZW91c192ZWdldGF0aW9uICsgaGVyYmFjZW91c193ZXRsYW5kICsgb3Blbl9mb3Jlc3QgKyBwZXJtYW5lbnRfd2F0ZXIgKyBzaHJ1YnMgKyByZWFsbSArIG51bWJlcl9vZl9jaGVja2xpc3RzX3NjYWxlZCwgZWl0aGVyKQphbm92YShlaXRoZXJfbWl4ZWRfbW9kZWwsIGVpdGhlcl9maXhlZF9tb2RlbCkKYGBgCgpgYGB7cn0KZWl0aGVyX3JpY2huZXNzX3N1bSA8LSBtb2RlbF9zdW1tYXJ5KCdlaXRoZXInLCAncmljaG5lc3MnLCBlaXRoZXJfcmljaG5lc3NfcmVzdWx0KQplaXRoZXJfcmljaG5lc3Nfc3VtCmBgYAoKYGBge3J9CmVpdGhlcl9jaXR5X3Jlc3BvbnNlIDwtIGNyZWF0ZV9jaXR5X2RhdGFzZXQoZWl0aGVyX21peGVkX21vZGVsKQplaXRoZXJfY2l0eV9yZXNwb25zZVtvcmRlcihlaXRoZXJfY2l0eV9yZXNwb25zZSRyZXNwb25zZSksIGMoJ25hbWUnLCAncmVzcG9uc2UnKV0KYGBgCgpgYGB7cn0Kd3JpdGVfY3N2KGVpdGhlcl9jaXR5X3Jlc3BvbnNlWywgYygnbmFtZScsICdyZXNwb25zZScpXSwgJ3BlcmNlbnRhZ2Vfb2ZfcmVnaW9uYWxfcmljaG5lc3NfX291dHB1dF9fZWl0aGVyX2NpdHlfcmljaG5lc3NfaW50ZXJjZXB0LmNzdicpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpGdWxsIHJlc3VsdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmBgYHtyfQpyaWNobmVzc19hbGwgPC0gZnVsbF9qb2luKGZ1bGxfam9pbihtZXJsaW5fcmljaG5lc3Nfc3VtLCBibF9yaWNobmVzc19zdW0pLCBmdWxsX2pvaW4oYm90aF9yaWNobmVzc19zdW0sIGVpdGhlcl9yaWNobmVzc19zdW0pKQp3cml0ZV9jc3YocmljaG5lc3NfYWxsLCAicGVyY2VudGFnZV9vZl9yZWdpb25hbF9yaWNobmVzc19fb3V0cHV0X19yaWNobmVzc19yZXN1bHQuY3N2IikKcmljaG5lc3NfYWxsCmBgYAoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpBZGRpdGlvbmFsIGZpZ3VyZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0KbGlicmFyeSh0aWR5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdncHVicikKYGBgCgpgYGB7cn0KZW52aXJvbm1lbnQgPC0gbWVybGluWyxjKCdjbG9zZWRfZm9yZXN0JywgJ2N1bHRpdmF0ZWQnLCAnaGVyYmFjZW91c192ZWdldGF0aW9uJywgJ2hlcmJhY2VvdXNfd2V0bGFuZCcsICdvcGVuX2ZvcmVzdCcsICdwZXJtYW5lbnRfd2F0ZXInLCAnc2hydWJzJywgJ3VyYmFuJyldCm5hbWVzKGVudmlyb25tZW50KSA8LSBjKCdDbG9zZWQgRm9yZXN0JywgJ0N1bHRpdmF0ZWQnLCAnSGVyYmFjZW91cyBWZWdldGF0aW9uJywgJ0hlcmJhY2VvdXMgV2V0bGFuZCcsICdPcGVuIEZvcmVzdCcsICdQZXJtYW5lbnQgV2F0ZXInLCAnU2h1cmJzJywgJ1VyYmFuJykKbGFuZGNvdmVyIDwtIGdhdGhlcihlbnZpcm9ubWVudCwgbGFuZGNvdmVyLCBwcm9wb3J0aW9uKQoKZ2dwbG90KGxhbmRjb3ZlciwgYWVzKHggPSBsYW5kY292ZXIsIHkgPSBwcm9wb3J0aW9uKSkgKyBnZW9tX2JveHBsb3QoKSArIHhsYWIoJ0xhbmRjb3ZlciBDbGFzcycpICsgeWxhYignUHJvcG9ydGlvbiBpbiA1IGttIGFyb3VuZCBzaXRlcycpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IHNjYWxlczo6d3JhcF9mb3JtYXQoMTApKSArIHRoZW1lX2J3KCkgKyBsYWJzKHRpdGxlID0gIkxhbmRjb3ZlciBQcm9wb3J0aW9ucyIpCgpnZ3NhdmUoInBlcmNlbnRhZ2Vfb2ZfcmVnaW9uYWxfcmljaG5lc3NfX291dHB1dF9fc29tX2xhbmRjb3Zlcl9wcm9wb3J0aW9ucy5qcGciKQpgYGAKCmBgYHtyfQpnZ2FycmFuZ2UoCiAgZ2dwbG90KG1lcmxpbiwgYWVzKHkgPSBlbGV2YXRpb25fZGVsdGEpKSArIGdlb21fYm94cGxvdCgpICsgeGxhYignRWxldmF0aW9uIERlbHRhJykgKyB5bGFiKCdBdmVyYWdlIE1ldHJlcyBpbiA1IGttIGFyb3VuZCBzaXRlcycpICsKICAgIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gc2NhbGVzOjp3cmFwX2Zvcm1hdCgxMCkpICsgdGhlbWVfYncoKSwKICBnZ3Bsb3QobWVybGluLCBhZXMoeSA9IG1lYW5fZWxldmF0aW9uKSkgKyBnZW9tX2JveHBsb3QoKSArIHhsYWIoJ01lYW4gRWxldmF0aW9uJykgKyB5bGFiKCdBdmVyYWdlIE1ldHJlcyBpbiA1IGttIGFyb3VuZCBzaXRlcycpICsKICAgIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gc2NhbGVzOjp3cmFwX2Zvcm1hdCgxMCkpICsgdGhlbWVfYncoKQopCgpnZ3NhdmUoInBlcmNlbnRhZ2Vfb2ZfcmVnaW9uYWxfcmljaG5lc3NfX291dHB1dF9fc29tX2VsZXZhdGlvbnMuanBnIikKYGBgCgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkJpcmRsaWZlIFszMDAgb3IgbGVzcyBjaGVja2xpc3RzXTogRGlmZmVyZW5jZSBpbiByaWNobmVzcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYGBge3J9CmJpcmRsaWZlMzAwID0gYmlyZGxpZmVbYmlyZGxpZmUkbnVtYmVyX29mX2NoZWNrbGlzdHMgPD0gMzAwLF0KbnJvdyhiaXJkbGlmZTMwMCkKYGBgCgpgYGB7ciwgY2FjaGUgPSBUUlVFfQpibHIzMDBfcmljaG5lc3NfcmVzdWx0IDwtIG1vZGVsX2F2ZXJhZ2VfcmljaG5lc3MoYmlyZGxpZmUzMDApCmJscjMwMF9yaWNobmVzc19yZXN1bHQKYGBgCgoKYGBge3J9CmJsMzAwX3JpY2huZXNzX3N1bSA8LSBtb2RlbF9zdW1tYXJ5KCdiaXJkbGlmZScsICdyaWNobmVzcycsIGJscjMwMF9yaWNobmVzc19yZXN1bHQpCmJsMzAwX3JpY2huZXNzX3N1bQpgYGAKCmBgYHtyfQpiaXJkbGlmZTMwMF9yaWNobmVzc19wbG90IDwtIGJsMzAwX3JpY2huZXNzX3N1bVtibDMwMF9yaWNobmVzc19zdW0kbW9kZWwgPT0gJ2Z1bGwnLF0KCmJpcmRsaWZlMzAwX3JpY2huZXNzX3Bsb3QkZXhwbGFuYXRvcnkgPC0gZmFjdG9yKGJpcmRsaWZlMzAwX3JpY2huZXNzX3Bsb3QkZXhwbGFuYXRvcnksIGxldmVscyA9IGMoJ2Nsb3NlZF9mb3Jlc3QnLCAnb3Blbl9mb3Jlc3QnLCAnc2hydWJzJywgJ2hlcmJhY2VvdXNfdmVnZXRhdGlvbicsICdoZXJiYWNlb3VzX3dldGxhbmQnLCAncGVybWFuZW50X3dhdGVyJywgJ2N1bHRpdmF0ZWQnLCAndXJiYW4nLCAnbWVhbl9lbGV2YXRpb25fc2NhbGVkJywgJ2VsZXZhdGlvbl9kZWx0YV9zY2FsZWQnLCAncmVhbG1BZnJvdHJvcGljJywgJ3JlYWxtQXVzdHJhbGFzaWEnLCAncmVhbG1JbmRvbWFsYXlhbicsICdyZWFsbU5lYXJjdGljJywgJ3JlYWxtTmVvdHJvcGljJywgJ251bWJlcl9vZl9jaGVja2xpc3RzX3NjYWxlZCcpKQpiaXJkbGlmZTMwMF9yaWNobmVzc19wbG90JHR5cGUgPC0gJ1Byb3BvcnRpb24gb2YgbGFuZGNvdmVyXG41IGttIGFyb3VuZCBzaXRlJwpiaXJkbGlmZTMwMF9yaWNobmVzc19wbG90JHR5cGVbYmlyZGxpZmUzMDBfcmljaG5lc3NfcGxvdCRleHBsYW5hdG9yeSAlaW4lIGMoJ21lYW5fZWxldmF0aW9uX3NjYWxlZCcsICdlbGV2YXRpb25fZGVsdGFfc2NhbGVkJyldIDwtICdTY2FsZWQgKDAtMSkgYXZlcmFnZVxuZWxldmF0aW9uIDUga20gYXJvdW5kIHNpdGUnCmJpcmRsaWZlMzAwX3JpY2huZXNzX3Bsb3QkdHlwZVtiaXJkbGlmZTMwMF9yaWNobmVzc19wbG90JGV4cGxhbmF0b3J5ICVpbiUgYygncmVhbG1BZnJvdHJvcGljJywgJ3JlYWxtQXVzdHJhbGFzaWEnLCAncmVhbG1JbmRvbWFsYXlhbicsICdyZWFsbU5lYXJjdGljJywgJ3JlYWxtTmVvdHJvcGljJyldIDwtICdSZWFsbScKYmlyZGxpZmUzMDBfcmljaG5lc3NfcGxvdCR0eXBlW2JpcmRsaWZlMzAwX3JpY2huZXNzX3Bsb3QkZXhwbGFuYXRvcnkgJWluJSBjKCdudW1iZXJfb2ZfY2hlY2tsaXN0c19zY2FsZWQnKV0gPC0gJ1NjYWxlZCAoMCAtIDEpIG51bWJlclxub2YgY2hlY2tsaXN0cycKCmJpcmRsaWZlMzAwX3Bsb3QgPSBnZ3Bsb3QoYmlyZGxpZmUzMDBfcmljaG5lc3NfcGxvdCwgYWVzKHk9ZXhwbGFuYXRvcnksIHg9cmljaG5lc3NfYmlyZGxpZmVfZXN0aW1hdGUsIGNvbG91ciA9IHR5cGUpKSArIAogIGdlb21fbGluZSgpICsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9lcnJvcmJhcihhZXMoeG1pbj1yaWNobmVzc19iaXJkbGlmZV9lc3RpbWF0ZS1yaWNobmVzc19iaXJkbGlmZV9lcnJvciwgeG1heD1yaWNobmVzc19iaXJkbGlmZV9lc3RpbWF0ZStyaWNobmVzc19iaXJkbGlmZV9lcnJvciksIHdpZHRoPS4yLAogICAgICAgICAgICAgICAgIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuMDUpKSArCiAgc2NhbGVfeV9kaXNjcmV0ZSgKICAgIGxpbWl0cyA9IHJldihsZXZlbHMoYmlyZGxpZmUzMDBfcmljaG5lc3NfcGxvdCRleHBsYW5hdG9yeSkpLCAKICAgIGxhYmVscyA9IGMoJ2Nsb3NlZF9mb3Jlc3QnID0gJ0Nsb3NlZCBmb3Jlc3QnLCAnb3Blbl9mb3Jlc3QnID0gJ09wZW4gZm9yZXN0JywgJ3NocnVicycgPSAnU2hydWJzJywgJ2hlcmJhY2VvdXNfdmVnZXRhdGlvbicgPSAnSGVyYmFjZW91c1xudmVnZXRhdGlvbicsICdoZXJiYWNlb3VzX3dldGxhbmQnID0gJ0hlcmJhY2VvdXNcbndldGxhbmQnLCAncGVybWFuZW50X3dhdGVyJyA9ICdQZXJtYW5lbnRcbndhdGVyJywgJ2N1bHRpdmF0ZWQnID0gJ0N1bHRpdmF0ZWQnLCAndXJiYW4nID0gJ1VyYmFuJywgJ21lYW5fZWxldmF0aW9uX3NjYWxlZCcgPSAnTWVhbiBlbGV2YXRpb25cbnNjYWxlZCcsICdlbGV2YXRpb25fZGVsdGFfc2NhbGVkJyA9ICdFbGV2YXRpb24gZGVsdGFcbnNjYWxlZCcsICdyZWFsbUFmcm90cm9waWMnID0gJ0Fmcm90cm9waWNhbCcsICdyZWFsbUF1c3RyYWxhc2lhJyA9ICdBdXN0YWxpYXNpYW4nLCAncmVhbG1JbmRvbWFsYXlhbicgPSAnSW5kb21hbGF5YW4nLCAncmVhbG1OZWFyY3RpYycgPSAnTmVhcmN0aWMnLCAncmVhbG1OZW90cm9waWMnID0gJ05lb3Ryb3BpY2FsJywgJ251bWJlcl9vZl9jaGVja2xpc3RzX3NjYWxlZCcgPSAnU3FydCBudW1iZXJcbm9mIGNoZWNrbGlzdHMnKSkgKwogIHRoZW1lX2J3KCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZG90dGVkIikgKwogIGd1aWRlcyhjb2xvdXI9Z3VpZGVfbGVnZW5kKHRpdGxlPSJQcmVkaWN0b3IgdHlwZSIpKSArIHhsYWIoJ0luY3JlYXNlIGluIHByb3BvcnRpb24gb2YgcmVnaW9uYWwgcG9vbCByaWNobmVzc1xuwrEgU3RhbmRhcmQgRXJyb3InKSArIHlsYWIoJ1ByZWRpY3RvcicpICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9ICJ0b3AiKQpiaXJkbGlmZTMwMF9wbG90Cmdnc2F2ZSgncGVyY2VudGFnZV9vZl9yZWdpb25hbF9yaWNobmVzc19fb3V0cHV0X19iaXJkbGlmZV9yaWNobmVzc18zMDBfY2hlY2tsaXN0c19vcl9sZXNzX3Jlc3VsdC5qcGcnKQpgYGAKCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQmlyZGxpZmUgW05vIEF1c3RyYWxhc2lhXTogRGlmZmVyZW5jZSBpbiByaWNobmVzcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYGBge3J9CmJpcmRsaWZlTm9BdXN0cmFsaWEgPSBiaXJkbGlmZVtiaXJkbGlmZSRyZWFsbSAhPSAnQXVzdHJhbGFzaWEnLF0KbnJvdyhiaXJkbGlmZU5vQXVzdHJhbGlhKQpgYGAKCmBgYHtyLCBjYWNoZSA9IFRSVUV9CmJsck5vQXVzdHJhbGlhX3JpY2huZXNzX3Jlc3VsdCA8LSBtb2RlbF9hdmVyYWdlX3JpY2huZXNzKGJpcmRsaWZlTm9BdXN0cmFsaWEpCmJsck5vQXVzdHJhbGlhX3JpY2huZXNzX3Jlc3VsdApgYGAKCgpgYGB7cn0KYmxOb0F1c3RyYWxpYV9yaWNobmVzc19zdW0gPC0gbW9kZWxfc3VtbWFyeSgnYmlyZGxpZmUnLCAncmljaG5lc3MnLCBibHJOb0F1c3RyYWxpYV9yaWNobmVzc19yZXN1bHQpCmJsTm9BdXN0cmFsaWFfcmljaG5lc3Nfc3VtCmBgYAoKYGBge3J9CmJpcmRsaWZlTm9BdXN0cmFsaWFfcmljaG5lc3NfcGxvdCA8LSBibE5vQXVzdHJhbGlhX3JpY2huZXNzX3N1bVtibE5vQXVzdHJhbGlhX3JpY2huZXNzX3N1bSRtb2RlbCA9PSAnZnVsbCcsXQoKYmlyZGxpZmVOb0F1c3RyYWxpYV9yaWNobmVzc19wbG90JGV4cGxhbmF0b3J5IDwtIGZhY3RvcihiaXJkbGlmZU5vQXVzdHJhbGlhX3JpY2huZXNzX3Bsb3QkZXhwbGFuYXRvcnksIGxldmVscyA9IGMoJ2Nsb3NlZF9mb3Jlc3QnLCAnb3Blbl9mb3Jlc3QnLCAnc2hydWJzJywgJ2hlcmJhY2VvdXNfdmVnZXRhdGlvbicsICdoZXJiYWNlb3VzX3dldGxhbmQnLCAncGVybWFuZW50X3dhdGVyJywgJ2N1bHRpdmF0ZWQnLCAndXJiYW4nLCAnbWVhbl9lbGV2YXRpb25fc2NhbGVkJywgJ2VsZXZhdGlvbl9kZWx0YV9zY2FsZWQnLCAncmVhbG1BZnJvdHJvcGljJywgJ3JlYWxtQXVzdHJhbGFzaWEnLCAncmVhbG1JbmRvbWFsYXlhbicsICdyZWFsbU5lYXJjdGljJywgJ3JlYWxtTmVvdHJvcGljJywgJ251bWJlcl9vZl9jaGVja2xpc3RzX3NjYWxlZCcpKQpiaXJkbGlmZU5vQXVzdHJhbGlhX3JpY2huZXNzX3Bsb3QkdHlwZSA8LSAnUHJvcG9ydGlvbiBvZiBsYW5kY292ZXJcbjUga20gYXJvdW5kIHNpdGUnCmJpcmRsaWZlTm9BdXN0cmFsaWFfcmljaG5lc3NfcGxvdCR0eXBlW2JpcmRsaWZlTm9BdXN0cmFsaWFfcmljaG5lc3NfcGxvdCRleHBsYW5hdG9yeSAlaW4lIGMoJ21lYW5fZWxldmF0aW9uX3NjYWxlZCcsICdlbGV2YXRpb25fZGVsdGFfc2NhbGVkJyldIDwtICdTY2FsZWQgKDAtMSkgYXZlcmFnZVxuZWxldmF0aW9uIDUga20gYXJvdW5kIHNpdGUnCmJpcmRsaWZlTm9BdXN0cmFsaWFfcmljaG5lc3NfcGxvdCR0eXBlW2JpcmRsaWZlTm9BdXN0cmFsaWFfcmljaG5lc3NfcGxvdCRleHBsYW5hdG9yeSAlaW4lIGMoJ3JlYWxtQWZyb3Ryb3BpYycsICdyZWFsbUF1c3RyYWxhc2lhJywgJ3JlYWxtSW5kb21hbGF5YW4nLCAncmVhbG1OZWFyY3RpYycsICdyZWFsbU5lb3Ryb3BpYycpXSA8LSAnUmVhbG0nCmJpcmRsaWZlTm9BdXN0cmFsaWFfcmljaG5lc3NfcGxvdCR0eXBlW2JpcmRsaWZlTm9BdXN0cmFsaWFfcmljaG5lc3NfcGxvdCRleHBsYW5hdG9yeSAlaW4lIGMoJ251bWJlcl9vZl9jaGVja2xpc3RzX3NjYWxlZCcpXSA8LSAnU2NhbGVkICgwIC0gMSkgbnVtYmVyXG5vZiBjaGVja2xpc3RzJwoKYmlyZGxpZmVOb0F1c3RyYWxpYV9wbG90ID0gZ2dwbG90KGJpcmRsaWZlTm9BdXN0cmFsaWFfcmljaG5lc3NfcGxvdCwgYWVzKHk9ZXhwbGFuYXRvcnksIHg9cmljaG5lc3NfYmlyZGxpZmVfZXN0aW1hdGUsIGNvbG91ciA9IHR5cGUpKSArIAogIGdlb21fbGluZSgpICsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9lcnJvcmJhcihhZXMoeG1pbj1yaWNobmVzc19iaXJkbGlmZV9lc3RpbWF0ZS1yaWNobmVzc19iaXJkbGlmZV9lcnJvciwgeG1heD1yaWNobmVzc19iaXJkbGlmZV9lc3RpbWF0ZStyaWNobmVzc19iaXJkbGlmZV9lcnJvciksIHdpZHRoPS4yLAogICAgICAgICAgICAgICAgIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuMDUpKSArCiAgc2NhbGVfeV9kaXNjcmV0ZSgKICAgIGxpbWl0cyA9IHJldihsZXZlbHMoYmlyZGxpZmVOb0F1c3RyYWxpYV9yaWNobmVzc19wbG90JGV4cGxhbmF0b3J5KSksIAogICAgbGFiZWxzID0gYygnY2xvc2VkX2ZvcmVzdCcgPSAnQ2xvc2VkIGZvcmVzdCcsICdvcGVuX2ZvcmVzdCcgPSAnT3BlbiBmb3Jlc3QnLCAnc2hydWJzJyA9ICdTaHJ1YnMnLCAnaGVyYmFjZW91c192ZWdldGF0aW9uJyA9ICdIZXJiYWNlb3VzXG52ZWdldGF0aW9uJywgJ2hlcmJhY2VvdXNfd2V0bGFuZCcgPSAnSGVyYmFjZW91c1xud2V0bGFuZCcsICdwZXJtYW5lbnRfd2F0ZXInID0gJ1Blcm1hbmVudFxud2F0ZXInLCAnY3VsdGl2YXRlZCcgPSAnQ3VsdGl2YXRlZCcsICd1cmJhbicgPSAnVXJiYW4nLCAnbWVhbl9lbGV2YXRpb25fc2NhbGVkJyA9ICdNZWFuIGVsZXZhdGlvblxuc2NhbGVkJywgJ2VsZXZhdGlvbl9kZWx0YV9zY2FsZWQnID0gJ0VsZXZhdGlvbiBkZWx0YVxuc2NhbGVkJywgJ3JlYWxtQWZyb3Ryb3BpYycgPSAnQWZyb3Ryb3BpY2FsJywgJ3JlYWxtQXVzdHJhbGFzaWEnID0gJ0F1c3RhbGlhc2lhbicsICdyZWFsbUluZG9tYWxheWFuJyA9ICdJbmRvbWFsYXlhbicsICdyZWFsbU5lYXJjdGljJyA9ICdOZWFyY3RpYycsICdyZWFsbU5lb3Ryb3BpYycgPSAnTmVvdHJvcGljYWwnLCAnbnVtYmVyX29mX2NoZWNrbGlzdHNfc2NhbGVkJyA9ICdTcXJ0IG51bWJlclxub2YgY2hlY2tsaXN0cycpKSArCiAgdGhlbWVfYncoKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJkb3R0ZWQiKSArCiAgZ3VpZGVzKGNvbG91cj1ndWlkZV9sZWdlbmQodGl0bGU9IlByZWRpY3RvciB0eXBlIikpICsgeGxhYignSW5jcmVhc2UgaW4gcHJvcG9ydGlvbiBvZiByZWdpb25hbCBwb29sIHJpY2huZXNzXG7CsSBTdGFuZGFyZCBFcnJvcicpICsgeWxhYignUHJlZGljdG9yJykgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gInRvcCIpCmJpcmRsaWZlTm9BdXN0cmFsaWFfcGxvdApnZ3NhdmUoJ3BlcmNlbnRhZ2Vfb2ZfcmVnaW9uYWxfcmljaG5lc3NfX291dHB1dF9fYmlyZGxpZmVfcmljaG5lc3Nfbm9fYXVzdHJhbGlhLmpwZycpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkJpcmRsaWZlIFtObyBBZnJvdHJvcGljc106IERpZmZlcmVuY2UgaW4gcmljaG5lc3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmBgYHtyfQpiaXJkbGlmZU5vQWZyaWNhID0gYmlyZGxpZmVbYmlyZGxpZmUkcmVhbG0gIT0gJ0Fmcm90cm9waWMnLF0KbnJvdyhiaXJkbGlmZU5vQWZyaWNhKQpgYGAKCmBgYHtyLCBjYWNoZSA9IFRSVUV9CmJsck5vQWZyaWNhX3JpY2huZXNzX3Jlc3VsdCA8LSBtb2RlbF9hdmVyYWdlX3JpY2huZXNzKGJpcmRsaWZlTm9BZnJpY2EpCmJsck5vQWZyaWNhX3JpY2huZXNzX3Jlc3VsdApgYGAKCmBgYHtyfQpibE5vQWZyaWNhX3JpY2huZXNzX3N1bSA9IG1vZGVsX3N1bW1hcnkoJ2JpcmRsaWZlJywgJ3JpY2huZXNzJywgYmxyTm9BZnJpY2FfcmljaG5lc3NfcmVzdWx0KQpgYGAKCmBgYHtyfQpiaXJkbGlmZU5vQWZyaWNhX3JpY2huZXNzX3Bsb3QgPC0gYmxOb0FmcmljYV9yaWNobmVzc19zdW1bYmxOb0FmcmljYV9yaWNobmVzc19zdW0kbW9kZWwgPT0gJ2Z1bGwnLF0KCmJpcmRsaWZlTm9BZnJpY2FfcmljaG5lc3NfcGxvdCRleHBsYW5hdG9yeSA8LSBmYWN0b3IoYmlyZGxpZmVOb0FmcmljYV9yaWNobmVzc19wbG90JGV4cGxhbmF0b3J5LCBsZXZlbHMgPSBjKCdjbG9zZWRfZm9yZXN0JywgJ29wZW5fZm9yZXN0JywgJ3NocnVicycsICdoZXJiYWNlb3VzX3ZlZ2V0YXRpb24nLCAnaGVyYmFjZW91c193ZXRsYW5kJywgJ3Blcm1hbmVudF93YXRlcicsICdjdWx0aXZhdGVkJywgJ3VyYmFuJywgJ21lYW5fZWxldmF0aW9uX3NjYWxlZCcsICdlbGV2YXRpb25fZGVsdGFfc2NhbGVkJywgJ3JlYWxtQWZyb3Ryb3BpYycsICdyZWFsbUF1c3RyYWxhc2lhJywgJ3JlYWxtSW5kb21hbGF5YW4nLCAncmVhbG1OZWFyY3RpYycsICdyZWFsbU5lb3Ryb3BpYycsICdudW1iZXJfb2ZfY2hlY2tsaXN0c19zY2FsZWQnKSkKYmlyZGxpZmVOb0FmcmljYV9yaWNobmVzc19wbG90JHR5cGUgPC0gJ1Byb3BvcnRpb24gb2YgbGFuZGNvdmVyXG41IGttIGFyb3VuZCBzaXRlJwpiaXJkbGlmZU5vQWZyaWNhX3JpY2huZXNzX3Bsb3QkdHlwZVtiaXJkbGlmZU5vQWZyaWNhX3JpY2huZXNzX3Bsb3QkZXhwbGFuYXRvcnkgJWluJSBjKCdtZWFuX2VsZXZhdGlvbl9zY2FsZWQnLCAnZWxldmF0aW9uX2RlbHRhX3NjYWxlZCcpXSA8LSAnU2NhbGVkICgwLTEpIGF2ZXJhZ2VcbmVsZXZhdGlvbiA1IGttIGFyb3VuZCBzaXRlJwpiaXJkbGlmZU5vQWZyaWNhX3JpY2huZXNzX3Bsb3QkdHlwZVtiaXJkbGlmZU5vQWZyaWNhX3JpY2huZXNzX3Bsb3QkZXhwbGFuYXRvcnkgJWluJSBjKCdyZWFsbUFmcm90cm9waWMnLCAncmVhbG1BdXN0cmFsYXNpYScsICdyZWFsbUluZG9tYWxheWFuJywgJ3JlYWxtTmVhcmN0aWMnLCAncmVhbG1OZW90cm9waWMnKV0gPC0gJ1JlYWxtJwpiaXJkbGlmZU5vQWZyaWNhX3JpY2huZXNzX3Bsb3QkdHlwZVtiaXJkbGlmZU5vQWZyaWNhX3JpY2huZXNzX3Bsb3QkZXhwbGFuYXRvcnkgJWluJSBjKCdudW1iZXJfb2ZfY2hlY2tsaXN0c19zY2FsZWQnKV0gPC0gJ1NjYWxlZCAoMCAtIDEpIG51bWJlclxub2YgY2hlY2tsaXN0cycKCmJpcmRsaWZlTm9BZnJpY2FfcGxvdCA9IGdncGxvdChiaXJkbGlmZU5vQWZyaWNhX3JpY2huZXNzX3Bsb3QsIGFlcyh5PWV4cGxhbmF0b3J5LCB4PXJpY2huZXNzX2JpcmRsaWZlX2VzdGltYXRlLCBjb2xvdXIgPSB0eXBlKSkgKyAKICBnZW9tX2xpbmUoKSArCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fZXJyb3JiYXIoYWVzKHhtaW49cmljaG5lc3NfYmlyZGxpZmVfZXN0aW1hdGUtcmljaG5lc3NfYmlyZGxpZmVfZXJyb3IsIHhtYXg9cmljaG5lc3NfYmlyZGxpZmVfZXN0aW1hdGUrcmljaG5lc3NfYmlyZGxpZmVfZXJyb3IpLCB3aWR0aD0uMiwKICAgICAgICAgICAgICAgICBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjA1KSkgKwogIHNjYWxlX3lfZGlzY3JldGUoCiAgICBsaW1pdHMgPSByZXYobGV2ZWxzKGJpcmRsaWZlTm9BZnJpY2FfcmljaG5lc3NfcGxvdCRleHBsYW5hdG9yeSkpLCAKICAgIGxhYmVscyA9IGMoJ2Nsb3NlZF9mb3Jlc3QnID0gJ0Nsb3NlZCBmb3Jlc3QnLCAnb3Blbl9mb3Jlc3QnID0gJ09wZW4gZm9yZXN0JywgJ3NocnVicycgPSAnU2hydWJzJywgJ2hlcmJhY2VvdXNfdmVnZXRhdGlvbicgPSAnSGVyYmFjZW91c1xudmVnZXRhdGlvbicsICdoZXJiYWNlb3VzX3dldGxhbmQnID0gJ0hlcmJhY2VvdXNcbndldGxhbmQnLCAncGVybWFuZW50X3dhdGVyJyA9ICdQZXJtYW5lbnRcbndhdGVyJywgJ2N1bHRpdmF0ZWQnID0gJ0N1bHRpdmF0ZWQnLCAndXJiYW4nID0gJ1VyYmFuJywgJ21lYW5fZWxldmF0aW9uX3NjYWxlZCcgPSAnTWVhbiBlbGV2YXRpb25cbnNjYWxlZCcsICdlbGV2YXRpb25fZGVsdGFfc2NhbGVkJyA9ICdFbGV2YXRpb24gZGVsdGFcbnNjYWxlZCcsICdyZWFsbUFmcm90cm9waWMnID0gJ0Fmcm90cm9waWNhbCcsICdyZWFsbUF1c3RyYWxhc2lhJyA9ICdBdXN0YWxpYXNpYW4nLCAncmVhbG1JbmRvbWFsYXlhbicgPSAnSW5kb21hbGF5YW4nLCAncmVhbG1OZWFyY3RpYycgPSAnTmVhcmN0aWMnLCAncmVhbG1OZW90cm9waWMnID0gJ05lb3Ryb3BpY2FsJywgJ251bWJlcl9vZl9jaGVja2xpc3RzX3NjYWxlZCcgPSAnU3FydCBudW1iZXJcbm9mIGNoZWNrbGlzdHMnKSkgKwogIHRoZW1lX2J3KCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZG90dGVkIikgKwogIGd1aWRlcyhjb2xvdXI9Z3VpZGVfbGVnZW5kKHRpdGxlPSJQcmVkaWN0b3IgdHlwZSIpKSArIHhsYWIoJ0luY3JlYXNlIGluIHByb3BvcnRpb24gb2YgcmVnaW9uYWwgcG9vbCByaWNobmVzc1xuwrEgU3RhbmRhcmQgRXJyb3InKSArIHlsYWIoJ1ByZWRpY3RvcicpICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9ICJ0b3AiKQpiaXJkbGlmZU5vQWZyaWNhX3Bsb3QKZ2dzYXZlKCdwZXJjZW50YWdlX29mX3JlZ2lvbmFsX3JpY2huZXNzX19vdXRwdXRfX2JpcmRsaWZlX3JpY2huZXNzX25vX2FmcmljYS5qcGcnKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpCaXJkbGlmZSBbTm8gQWZyb3Ryb3BpY3MgYW5kIG5vIEF1c3RyYWxpc2lhXTogRGlmZmVyZW5jZSBpbiByaWNobmVzcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYGBge3J9CmJpcmRsaWZlTmVpdGhlckFmck5vckF1cyA9IGJpcmRsaWZlW2JpcmRsaWZlJHJlYWxtICE9ICdBZnJvdHJvcGljJyAmIGJpcmRsaWZlJHJlYWxtICE9ICdBdXN0cmFsYXNpYScsXQpucm93KGJpcmRsaWZlTmVpdGhlckFmck5vckF1cykKYGBgCgpgYGB7ciwgY2FjaGUgPSBUUlVFfQpibHJOQUFfcmljaG5lc3NfcmVzdWx0IDwtIG1vZGVsX2F2ZXJhZ2VfcmljaG5lc3MoYmlyZGxpZmVOZWl0aGVyQWZyTm9yQXVzKQpibHJOQUFfcmljaG5lc3NfcmVzdWx0CmBgYAoKCmBgYHtyfQpibE5BQV9yaWNobmVzc19zdW0gPC0gbW9kZWxfc3VtbWFyeSgnYmlyZGxpZmUnLCAncmljaG5lc3MnLCBibHJOQUFfcmljaG5lc3NfcmVzdWx0KQpibE5BQV9yaWNobmVzc19zdW0KYGBgCgpgYGB7cn0KYmlyZGxpZmVOQUFfcmljaG5lc3NfcGxvdCA8LSBibE5BQV9yaWNobmVzc19zdW1bYmxOQUFfcmljaG5lc3Nfc3VtJG1vZGVsID09ICdmdWxsJyxdCgpiaXJkbGlmZU5BQV9yaWNobmVzc19wbG90JGV4cGxhbmF0b3J5IDwtIGZhY3RvcihiaXJkbGlmZU5BQV9yaWNobmVzc19wbG90JGV4cGxhbmF0b3J5LCBsZXZlbHMgPSBjKCdjbG9zZWRfZm9yZXN0JywgJ29wZW5fZm9yZXN0JywgJ3NocnVicycsICdoZXJiYWNlb3VzX3ZlZ2V0YXRpb24nLCAnaGVyYmFjZW91c193ZXRsYW5kJywgJ3Blcm1hbmVudF93YXRlcicsICdjdWx0aXZhdGVkJywgJ3VyYmFuJywgJ21lYW5fZWxldmF0aW9uX3NjYWxlZCcsICdlbGV2YXRpb25fZGVsdGFfc2NhbGVkJywgJ3JlYWxtQWZyb3Ryb3BpYycsICdyZWFsbUF1c3RyYWxhc2lhJywgJ3JlYWxtSW5kb21hbGF5YW4nLCAncmVhbG1OZWFyY3RpYycsICdyZWFsbU5lb3Ryb3BpYycsICdudW1iZXJfb2ZfY2hlY2tsaXN0c19zY2FsZWQnKSkKYmlyZGxpZmVOQUFfcmljaG5lc3NfcGxvdCR0eXBlIDwtICdQcm9wb3J0aW9uIG9mIGxhbmRjb3ZlclxuNSBrbSBhcm91bmQgc2l0ZScKYmlyZGxpZmVOQUFfcmljaG5lc3NfcGxvdCR0eXBlW2JpcmRsaWZlTkFBX3JpY2huZXNzX3Bsb3QkZXhwbGFuYXRvcnkgJWluJSBjKCdtZWFuX2VsZXZhdGlvbl9zY2FsZWQnLCAnZWxldmF0aW9uX2RlbHRhX3NjYWxlZCcpXSA8LSAnU2NhbGVkICgwLTEpIGF2ZXJhZ2VcbmVsZXZhdGlvbiA1IGttIGFyb3VuZCBzaXRlJwpiaXJkbGlmZU5BQV9yaWNobmVzc19wbG90JHR5cGVbYmlyZGxpZmVOQUFfcmljaG5lc3NfcGxvdCRleHBsYW5hdG9yeSAlaW4lIGMoJ3JlYWxtQWZyb3Ryb3BpYycsICdyZWFsbUF1c3RyYWxhc2lhJywgJ3JlYWxtSW5kb21hbGF5YW4nLCAncmVhbG1OZWFyY3RpYycsICdyZWFsbU5lb3Ryb3BpYycpXSA8LSAnUmVhbG0nCmJpcmRsaWZlTkFBX3JpY2huZXNzX3Bsb3QkdHlwZVtiaXJkbGlmZU5BQV9yaWNobmVzc19wbG90JGV4cGxhbmF0b3J5ICVpbiUgYygnbnVtYmVyX29mX2NoZWNrbGlzdHNfc2NhbGVkJyldIDwtICdTY2FsZWQgKDAgLSAxKSBudW1iZXJcbm9mIGNoZWNrbGlzdHMnCgpiaXJkbGlmZU5BQV9wbG90ID0gZ2dwbG90KGJpcmRsaWZlTkFBX3JpY2huZXNzX3Bsb3QsIGFlcyh5PWV4cGxhbmF0b3J5LCB4PXJpY2huZXNzX2JpcmRsaWZlX2VzdGltYXRlLCBjb2xvdXIgPSB0eXBlKSkgKyAKICBnZW9tX2xpbmUoKSArCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fZXJyb3JiYXIoYWVzKHhtaW49cmljaG5lc3NfYmlyZGxpZmVfZXN0aW1hdGUtcmljaG5lc3NfYmlyZGxpZmVfZXJyb3IsIHhtYXg9cmljaG5lc3NfYmlyZGxpZmVfZXN0aW1hdGUrcmljaG5lc3NfYmlyZGxpZmVfZXJyb3IpLCB3aWR0aD0uMiwKICAgICAgICAgICAgICAgICBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjA1KSkgKwogIHNjYWxlX3lfZGlzY3JldGUoCiAgICBsaW1pdHMgPSByZXYobGV2ZWxzKGJpcmRsaWZlTkFBX3JpY2huZXNzX3Bsb3QkZXhwbGFuYXRvcnkpKSwgCiAgICBsYWJlbHMgPSBjKCdjbG9zZWRfZm9yZXN0JyA9ICdDbG9zZWQgZm9yZXN0JywgJ29wZW5fZm9yZXN0JyA9ICdPcGVuIGZvcmVzdCcsICdzaHJ1YnMnID0gJ1NocnVicycsICdoZXJiYWNlb3VzX3ZlZ2V0YXRpb24nID0gJ0hlcmJhY2VvdXNcbnZlZ2V0YXRpb24nLCAnaGVyYmFjZW91c193ZXRsYW5kJyA9ICdIZXJiYWNlb3VzXG53ZXRsYW5kJywgJ3Blcm1hbmVudF93YXRlcicgPSAnUGVybWFuZW50XG53YXRlcicsICdjdWx0aXZhdGVkJyA9ICdDdWx0aXZhdGVkJywgJ3VyYmFuJyA9ICdVcmJhbicsICdtZWFuX2VsZXZhdGlvbl9zY2FsZWQnID0gJ01lYW4gZWxldmF0aW9uXG5zY2FsZWQnLCAnZWxldmF0aW9uX2RlbHRhX3NjYWxlZCcgPSAnRWxldmF0aW9uIGRlbHRhXG5zY2FsZWQnLCAncmVhbG1BZnJvdHJvcGljJyA9ICdBZnJvdHJvcGljYWwnLCAncmVhbG1BdXN0cmFsYXNpYScgPSAnQXVzdGFsaWFzaWFuJywgJ3JlYWxtSW5kb21hbGF5YW4nID0gJ0luZG9tYWxheWFuJywgJ3JlYWxtTmVhcmN0aWMnID0gJ05lYXJjdGljJywgJ3JlYWxtTmVvdHJvcGljJyA9ICdOZW90cm9waWNhbCcsICdudW1iZXJfb2ZfY2hlY2tsaXN0c19zY2FsZWQnID0gJ1NxcnQgbnVtYmVyXG5vZiBjaGVja2xpc3RzJykpICsKICB0aGVtZV9idygpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImRvdHRlZCIpICsKICBndWlkZXMoY29sb3VyPWd1aWRlX2xlZ2VuZCh0aXRsZT0iUHJlZGljdG9yIHR5cGUiKSkgKyB4bGFiKCdJbmNyZWFzZSBpbiBwcm9wb3J0aW9uIG9mIHJlZ2lvbmFsIHBvb2wgcmljaG5lc3NcbsKxIFN0YW5kYXJkIEVycm9yJykgKyB5bGFiKCdQcmVkaWN0b3InKSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSAidG9wIikKYmlyZGxpZmVOQUFfcGxvdApnZ3NhdmUoJ3BlcmNlbnRhZ2Vfb2ZfcmVnaW9uYWxfcmljaG5lc3NfX291dHB1dF9fYmlyZGxpZmVfcmljaG5lc3Nfbm9fYWZyaWNhX25vcl9hdXN0cmFsaXNpYS5qcGcnKQpgYGAKCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQmlyZGxpZmUgW1VyYmFuIE9ubHldOiBEaWZmZXJlbmNlIGluIHJpY2huZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpgYGB7cn0KYmlyZGxpZmUkdXJiYW5fcm91bmRlZCA9IGZsb29yKGJpcmRsaWZlJHVyYmFuICogMTApIC8gMTAKZ2dwbG90KGJpcmRsaWZlLCBhZXMoeCA9IHVyYmFuX3JvdW5kZWQpKSArIGdlb21fYmFyKCkKYGBgCgpgYGB7cn0KYmlyZGxpZmVIaWdoZXJVcmJhbiA9IGJpcmRsaWZlW2JpcmRsaWZlJHVyYmFuID4gMC4yLF0KbnJvdyhiaXJkbGlmZUhpZ2hlclVyYmFuKQpgYGAKCmBgYHtyLCBjYWNoZSA9IFRSVUV9CmJsckhpZ2hlclVyYmFuX3JpY2huZXNzX3Jlc3VsdCA8LSBtb2RlbF9hdmVyYWdlX3JpY2huZXNzKGJpcmRsaWZlSGlnaGVyVXJiYW4pCmJsckhpZ2hlclVyYmFuX3JpY2huZXNzX3Jlc3VsdApgYGAKCgpgYGB7cn0KYmxySGlnaGVyVXJiYW5fcmljaG5lc3Nfc3VtIDwtIG1vZGVsX3N1bW1hcnkoJ2JpcmRsaWZlJywgJ3JpY2huZXNzJywgYmxySGlnaGVyVXJiYW5fcmljaG5lc3NfcmVzdWx0KQpibHJIaWdoZXJVcmJhbl9yaWNobmVzc19zdW0KYGBgCgpgYGB7cn0KYmlyZGxpZmVIUl9yaWNobmVzc19wbG90IDwtIGJsckhpZ2hlclVyYmFuX3JpY2huZXNzX3N1bVtibHJIaWdoZXJVcmJhbl9yaWNobmVzc19zdW0kbW9kZWwgPT0gJ2Z1bGwnLF0KCmJpcmRsaWZlSFJfcmljaG5lc3NfcGxvdCRleHBsYW5hdG9yeSA8LSBmYWN0b3IoYmlyZGxpZmVIUl9yaWNobmVzc19wbG90JGV4cGxhbmF0b3J5LCBsZXZlbHMgPSBjKCdjbG9zZWRfZm9yZXN0JywgJ29wZW5fZm9yZXN0JywgJ3NocnVicycsICdoZXJiYWNlb3VzX3ZlZ2V0YXRpb24nLCAnaGVyYmFjZW91c193ZXRsYW5kJywgJ3Blcm1hbmVudF93YXRlcicsICdjdWx0aXZhdGVkJywgJ3VyYmFuJywgJ21lYW5fZWxldmF0aW9uX3NjYWxlZCcsICdlbGV2YXRpb25fZGVsdGFfc2NhbGVkJywgJ3JlYWxtQWZyb3Ryb3BpYycsICdyZWFsbUF1c3RyYWxhc2lhJywgJ3JlYWxtSW5kb21hbGF5YW4nLCAncmVhbG1OZWFyY3RpYycsICdyZWFsbU5lb3Ryb3BpYycsICdudW1iZXJfb2ZfY2hlY2tsaXN0c19zY2FsZWQnKSkKYmlyZGxpZmVIUl9yaWNobmVzc19wbG90JHR5cGUgPC0gJ1Byb3BvcnRpb24gb2YgbGFuZGNvdmVyXG41IGttIGFyb3VuZCBzaXRlJwpiaXJkbGlmZUhSX3JpY2huZXNzX3Bsb3QkdHlwZVtiaXJkbGlmZUhSX3JpY2huZXNzX3Bsb3QkZXhwbGFuYXRvcnkgJWluJSBjKCdtZWFuX2VsZXZhdGlvbl9zY2FsZWQnLCAnZWxldmF0aW9uX2RlbHRhX3NjYWxlZCcpXSA8LSAnU2NhbGVkICgwLTEpIGF2ZXJhZ2VcbmVsZXZhdGlvbiA1IGttIGFyb3VuZCBzaXRlJwpiaXJkbGlmZUhSX3JpY2huZXNzX3Bsb3QkdHlwZVtiaXJkbGlmZUhSX3JpY2huZXNzX3Bsb3QkZXhwbGFuYXRvcnkgJWluJSBjKCdyZWFsbUFmcm90cm9waWMnLCAncmVhbG1BdXN0cmFsYXNpYScsICdyZWFsbUluZG9tYWxheWFuJywgJ3JlYWxtTmVhcmN0aWMnLCAncmVhbG1OZW90cm9waWMnKV0gPC0gJ1JlYWxtJwpiaXJkbGlmZUhSX3JpY2huZXNzX3Bsb3QkdHlwZVtiaXJkbGlmZUhSX3JpY2huZXNzX3Bsb3QkZXhwbGFuYXRvcnkgJWluJSBjKCdudW1iZXJfb2ZfY2hlY2tsaXN0c19zY2FsZWQnKV0gPC0gJ1NjYWxlZCAoMCAtIDEpIG51bWJlclxub2YgY2hlY2tsaXN0cycKCmJpcmRsaWZlSFJfcGxvdCA9IGdncGxvdChiaXJkbGlmZUhSX3JpY2huZXNzX3Bsb3QsIGFlcyh5PWV4cGxhbmF0b3J5LCB4PXJpY2huZXNzX2JpcmRsaWZlX2VzdGltYXRlLCBjb2xvdXIgPSB0eXBlKSkgKyAKICBnZW9tX2xpbmUoKSArCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fZXJyb3JiYXIoYWVzKHhtaW49cmljaG5lc3NfYmlyZGxpZmVfZXN0aW1hdGUtcmljaG5lc3NfYmlyZGxpZmVfZXJyb3IsIHhtYXg9cmljaG5lc3NfYmlyZGxpZmVfZXN0aW1hdGUrcmljaG5lc3NfYmlyZGxpZmVfZXJyb3IpLCB3aWR0aD0uMiwKICAgICAgICAgICAgICAgICBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjA1KSkgKwogIHNjYWxlX3lfZGlzY3JldGUoCiAgICBsaW1pdHMgPSByZXYobGV2ZWxzKGJpcmRsaWZlSFJfcmljaG5lc3NfcGxvdCRleHBsYW5hdG9yeSkpLCAKICAgIGxhYmVscyA9IGMoJ2Nsb3NlZF9mb3Jlc3QnID0gJ0Nsb3NlZCBmb3Jlc3QnLCAnb3Blbl9mb3Jlc3QnID0gJ09wZW4gZm9yZXN0JywgJ3NocnVicycgPSAnU2hydWJzJywgJ2hlcmJhY2VvdXNfdmVnZXRhdGlvbicgPSAnSGVyYmFjZW91c1xudmVnZXRhdGlvbicsICdoZXJiYWNlb3VzX3dldGxhbmQnID0gJ0hlcmJhY2VvdXNcbndldGxhbmQnLCAncGVybWFuZW50X3dhdGVyJyA9ICdQZXJtYW5lbnRcbndhdGVyJywgJ2N1bHRpdmF0ZWQnID0gJ0N1bHRpdmF0ZWQnLCAndXJiYW4nID0gJ1VyYmFuJywgJ21lYW5fZWxldmF0aW9uX3NjYWxlZCcgPSAnTWVhbiBlbGV2YXRpb25cbnNjYWxlZCcsICdlbGV2YXRpb25fZGVsdGFfc2NhbGVkJyA9ICdFbGV2YXRpb24gZGVsdGFcbnNjYWxlZCcsICdyZWFsbUFmcm90cm9waWMnID0gJ0Fmcm90cm9waWNhbCcsICdyZWFsbUF1c3RyYWxhc2lhJyA9ICdBdXN0YWxpYXNpYW4nLCAncmVhbG1JbmRvbWFsYXlhbicgPSAnSW5kb21hbGF5YW4nLCAncmVhbG1OZWFyY3RpYycgPSAnTmVhcmN0aWMnLCAncmVhbG1OZW90cm9waWMnID0gJ05lb3Ryb3BpY2FsJywgJ251bWJlcl9vZl9jaGVja2xpc3RzX3NjYWxlZCcgPSAnU3FydCBudW1iZXJcbm9mIGNoZWNrbGlzdHMnKSkgKwogIHRoZW1lX2J3KCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZG90dGVkIikgKwogIGd1aWRlcyhjb2xvdXI9Z3VpZGVfbGVnZW5kKHRpdGxlPSJQcmVkaWN0b3IgdHlwZSIpKSArIHhsYWIoJ0luY3JlYXNlIGluIHByb3BvcnRpb24gb2YgcmVnaW9uYWwgcG9vbCByaWNobmVzc1xuwrEgU3RhbmRhcmQgRXJyb3InKSArIHlsYWIoJ1ByZWRpY3RvcicpICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9ICJ0b3AiKQpiaXJkbGlmZUhSX3Bsb3QKZ2dzYXZlKCdwZXJjZW50YWdlX29mX3JlZ2lvbmFsX3JpY2huZXNzX19vdXRwdXRfX2JpcmRsaWZlX3JpY2huZXNzX2hpZ2hlcl91cmJhbi5qcGcnKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpCaXJkbGlmZSBbQ2hlY2sgcHNldWRvcmVwbGljYXRpb25dOiBEaWZmZXJlbmNlIGluIHJpY2huZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmxvY2FsaXR5X3NhbXBsZXMgPSByZWFkX2NzdigncGVyY2VudGFnZV9vZl9yZWdpb25hbF9yaWNobmVzc19faW5wdXRfX3NhbXBsZWRfbG9jYWxpdGllc19taW5fZGlzdGFuY2VfNTAwbS5jc3YnKQp0YWJsZShsb2NhbGl0eV9zYW1wbGVzJFNBTVBMRV9JRCkKYGBgCgoKYGBge3J9CnBsb3Rfc2FtcGxlID0gZnVuY3Rpb24oc2FtcGxlX2lkKSB7CiAgYmlyZGxpZmVfc2FtcGxlMCA9IGJpcmRsaWZlW2JpcmRsaWZlJGxvY2FsaXR5X2lkICVpbiUgbG9jYWxpdHlfc2FtcGxlcyRMT0NBTElUWV9JRFtsb2NhbGl0eV9zYW1wbGVzJFNBTVBMRV9JRCA9PSBzYW1wbGVfaWRdLF0KICAKICBiaXJkbGlmZV9zYW1wbGUwX3JpY2huZXNzX3Jlc3VsdCA8LSBtb2RlbF9hdmVyYWdlX3JpY2huZXNzKGJpcmRsaWZlX3NhbXBsZTApCiAgYmlyZGxpZmVfc2FtcGxlMF9yaWNobmVzc19zdW1tYXJ5IDwtIG1vZGVsX3N1bW1hcnkoJ2JpcmRsaWZlJywgJ3JpY2huZXNzJywgYmlyZGxpZmVfc2FtcGxlMF9yaWNobmVzc19yZXN1bHQpCiAgCiAgYmlyZGxpZmVfc2FtcGxlMF9yaWNobmVzc19wbG90IDwtIGJpcmRsaWZlX3NhbXBsZTBfcmljaG5lc3Nfc3VtbWFyeVtiaXJkbGlmZV9zYW1wbGUwX3JpY2huZXNzX3N1bW1hcnkkbW9kZWwgPT0gJ2Z1bGwnLF0KICAKICBiaXJkbGlmZV9zYW1wbGUwX3JpY2huZXNzX3Bsb3QkZXhwbGFuYXRvcnkgPC0gZmFjdG9yKGJpcmRsaWZlX3NhbXBsZTBfcmljaG5lc3NfcGxvdCRleHBsYW5hdG9yeSwgbGV2ZWxzID0gYygnY2xvc2VkX2ZvcmVzdCcsICdvcGVuX2ZvcmVzdCcsICdzaHJ1YnMnLCAnaGVyYmFjZW91c192ZWdldGF0aW9uJywgJ2hlcmJhY2VvdXNfd2V0bGFuZCcsICdwZXJtYW5lbnRfd2F0ZXInLCAnY3VsdGl2YXRlZCcsICd1cmJhbicsICdtZWFuX2VsZXZhdGlvbl9zY2FsZWQnLCAnZWxldmF0aW9uX2RlbHRhX3NjYWxlZCcsICdyZWFsbUFmcm90cm9waWMnLCAncmVhbG1BdXN0cmFsYXNpYScsICdyZWFsbUluZG9tYWxheWFuJywgJ3JlYWxtTmVhcmN0aWMnLCAncmVhbG1OZW90cm9waWMnLCAnbnVtYmVyX29mX2NoZWNrbGlzdHNfc2NhbGVkJykpCiAgYmlyZGxpZmVfc2FtcGxlMF9yaWNobmVzc19wbG90JHR5cGUgPC0gJ1Byb3BvcnRpb24gb2YgbGFuZGNvdmVyXG41IGttIGFyb3VuZCBzaXRlJwogIGJpcmRsaWZlX3NhbXBsZTBfcmljaG5lc3NfcGxvdCR0eXBlW2JpcmRsaWZlX3NhbXBsZTBfcmljaG5lc3NfcGxvdCRleHBsYW5hdG9yeSAlaW4lIGMoJ21lYW5fZWxldmF0aW9uX3NjYWxlZCcsICdlbGV2YXRpb25fZGVsdGFfc2NhbGVkJyldIDwtICdTY2FsZWQgKDAtMSkgYXZlcmFnZVxuZWxldmF0aW9uIDUga20gYXJvdW5kIHNpdGUnCiAgYmlyZGxpZmVfc2FtcGxlMF9yaWNobmVzc19wbG90JHR5cGVbYmlyZGxpZmVfc2FtcGxlMF9yaWNobmVzc19wbG90JGV4cGxhbmF0b3J5ICVpbiUgYygncmVhbG1BZnJvdHJvcGljJywgJ3JlYWxtQXVzdHJhbGFzaWEnLCAncmVhbG1JbmRvbWFsYXlhbicsICdyZWFsbU5lYXJjdGljJywgJ3JlYWxtTmVvdHJvcGljJyldIDwtICdSZWFsbScKICBiaXJkbGlmZV9zYW1wbGUwX3JpY2huZXNzX3Bsb3QkdHlwZVtiaXJkbGlmZV9zYW1wbGUwX3JpY2huZXNzX3Bsb3QkZXhwbGFuYXRvcnkgJWluJSBjKCdudW1iZXJfb2ZfY2hlY2tsaXN0c19zY2FsZWQnKV0gPC0gJ1NjYWxlZCAoMCAtIDEpIG51bWJlclxub2YgY2hlY2tsaXN0cycKICAKICBiaXJkbGlmZVNhbXBsZTBfcGxvdCA9IGdncGxvdChiaXJkbGlmZV9zYW1wbGUwX3JpY2huZXNzX3Bsb3QsIGFlcyh5PWV4cGxhbmF0b3J5LCB4PXJpY2huZXNzX2JpcmRsaWZlX2VzdGltYXRlLCBjb2xvdXIgPSB0eXBlKSkgKyAKICAgIGdlb21fbGluZSgpICsKICAgIGdlb21fcG9pbnQoKSsKICAgIGdlb21fZXJyb3JiYXIoYWVzKHhtaW49cmljaG5lc3NfYmlyZGxpZmVfZXN0aW1hdGUtcmljaG5lc3NfYmlyZGxpZmVfZXJyb3IsIHhtYXg9cmljaG5lc3NfYmlyZGxpZmVfZXN0aW1hdGUrcmljaG5lc3NfYmlyZGxpZmVfZXJyb3IpLCB3aWR0aD0uMiwKICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuMDUpKSArCiAgICBzY2FsZV95X2Rpc2NyZXRlKAogICAgICBsaW1pdHMgPSByZXYobGV2ZWxzKGJpcmRsaWZlX3NhbXBsZTBfcmljaG5lc3NfcGxvdCRleHBsYW5hdG9yeSkpLCAKICAgICAgbGFiZWxzID0gYygnY2xvc2VkX2ZvcmVzdCcgPSAnQ2xvc2VkIGZvcmVzdCcsICdvcGVuX2ZvcmVzdCcgPSAnT3BlbiBmb3Jlc3QnLCAnc2hydWJzJyA9ICdTaHJ1YnMnLCAnaGVyYmFjZW91c192ZWdldGF0aW9uJyA9ICdIZXJiYWNlb3VzXG52ZWdldGF0aW9uJywgJ2hlcmJhY2VvdXNfd2V0bGFuZCcgPSAnSGVyYmFjZW91c1xud2V0bGFuZCcsICdwZXJtYW5lbnRfd2F0ZXInID0gJ1Blcm1hbmVudFxud2F0ZXInLCAnY3VsdGl2YXRlZCcgPSAnQ3VsdGl2YXRlZCcsICd1cmJhbicgPSAnVXJiYW4nLCAnbWVhbl9lbGV2YXRpb25fc2NhbGVkJyA9ICdNZWFuIGVsZXZhdGlvblxuc2NhbGVkJywgJ2VsZXZhdGlvbl9kZWx0YV9zY2FsZWQnID0gJ0VsZXZhdGlvbiBkZWx0YVxuc2NhbGVkJywgJ3JlYWxtQWZyb3Ryb3BpYycgPSAnQWZyb3Ryb3BpY2FsJywgJ3JlYWxtQXVzdHJhbGFzaWEnID0gJ0F1c3RhbGlhc2lhbicsICdyZWFsbUluZG9tYWxheWFuJyA9ICdJbmRvbWFsYXlhbicsICdyZWFsbU5lYXJjdGljJyA9ICdOZWFyY3RpYycsICdyZWFsbU5lb3Ryb3BpYycgPSAnTmVvdHJvcGljYWwnLCAnbnVtYmVyX29mX2NoZWNrbGlzdHNfc2NhbGVkJyA9ICdTcXJ0IG51bWJlclxub2YgY2hlY2tsaXN0cycpKSArCiAgICB0aGVtZV9idygpICsKICAgIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBsaW5ldHlwZT0iZG90dGVkIikgKwogICAgZ3VpZGVzKGNvbG91cj1ndWlkZV9sZWdlbmQodGl0bGU9IlByZWRpY3RvciB0eXBlIikpICsgeGxhYignSW5jcmVhc2UgaW4gcHJvcG9ydGlvbiBvZiByZWdpb25hbCBwb29sIHJpY2huZXNzXG7CsSBTdGFuZGFyZCBFcnJvcicpICsgeWxhYignUHJlZGljdG9yJykgKwogICAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSAidG9wIikKICBiaXJkbGlmZVNhbXBsZTBfcGxvdAp9CmBgYAoKYGBge3J9CnBsb3Rfc2FtcGxlKCcwJykKZ2dzYXZlKCdwZXJjZW50YWdlX29mX3JlZ2lvbmFsX3JpY2huZXNzX19vdXRwdXRfX2JpcmRsaWZlX2xvY2FsaXR5X3NhbXBsZTAuanBnJykKYGBgCgpgYGB7cn0KcGxvdF9zYW1wbGUoJzEnKQpnZ3NhdmUoJ3BlcmNlbnRhZ2Vfb2ZfcmVnaW9uYWxfcmljaG5lc3NfX291dHB1dF9fYmlyZGxpZmVfbG9jYWxpdHlfc2FtcGxlMS5qcGcnKQpgYGAKCgpgYGB7cn0KcGxvdF9zYW1wbGUoJzInKQpnZ3NhdmUoJ3BlcmNlbnRhZ2Vfb2ZfcmVnaW9uYWxfcmljaG5lc3NfX291dHB1dF9fYmlyZGxpZmVfbG9jYWxpdHlfc2FtcGxlMi5qcGcnKQpgYGAKCmBgYHtyfQpwbG90X3NhbXBsZSgnMycpCmdnc2F2ZSgncGVyY2VudGFnZV9vZl9yZWdpb25hbF9yaWNobmVzc19fb3V0cHV0X19iaXJkbGlmZV9sb2NhbGl0eV9zYW1wbGUzLmpwZycpCmBgYAoKYGBge3J9CnBsb3Rfc2FtcGxlKCc0JykKZ2dzYXZlKCdwZXJjZW50YWdlX29mX3JlZ2lvbmFsX3JpY2huZXNzX19vdXRwdXRfX2JpcmRsaWZlX2xvY2FsaXR5X3NhbXBsZTQuanBnJykKYGBgCgpgYGB7cn0KcGxvdF9zYW1wbGUoJzUnKQpnZ3NhdmUoJ3BlcmNlbnRhZ2Vfb2ZfcmVnaW9uYWxfcmljaG5lc3NfX291dHB1dF9fYmlyZGxpZmVfbG9jYWxpdHlfc2FtcGxlNS5qcGcnKQpgYGAKCmBgYHtyfQpwbG90X3NhbXBsZSgnNicpCmdnc2F2ZSgncGVyY2VudGFnZV9vZl9yZWdpb25hbF9yaWNobmVzc19fb3V0cHV0X19iaXJkbGlmZV9sb2NhbGl0eV9zYW1wbGU2LmpwZycpCmBgYAoKYGBge3J9CnBsb3Rfc2FtcGxlKCc3JykKZ2dzYXZlKCdwZXJjZW50YWdlX29mX3JlZ2lvbmFsX3JpY2huZXNzX19vdXRwdXRfX2JpcmRsaWZlX2xvY2FsaXR5X3NhbXBsZTcuanBnJykKYGBgCgpgYGB7cn0KcGxvdF9zYW1wbGUoJzgnKQpnZ3NhdmUoJ3BlcmNlbnRhZ2Vfb2ZfcmVnaW9uYWxfcmljaG5lc3NfX291dHB1dF9fYmlyZGxpZmVfbG9jYWxpdHlfc2FtcGxlOC5qcGcnKQpgYGAKCmBgYHtyfQpwbG90X3NhbXBsZSgnOScpCmdnc2F2ZSgncGVyY2VudGFnZV9vZl9yZWdpb25hbF9yaWNobmVzc19fb3V0cHV0X19iaXJkbGlmZV9sb2NhbGl0eV9zYW1wbGU5LmpwZycpCmBgYA==